2012-06-21 88 views
3

我一直在我的頭上開了幾個小時,我認爲是簡單的SQL SELECT命令。我搜索了每個地方,並閱讀了與我有關的所有問題。我嘗試了一個SQL命令生成器,甚至閱讀並應用完整的SQL教程和手冊系列,試圖從頭開始理解它(這對於我來說非常重要,關於我最終必須構建的下一個命令......) 。從三個SQL SELECT和SUM

但現在我只是堅持我想要的結果,但對中隔離選擇,我似乎無法走到一起的命令!

這裏是我的情況:3個表,第一個鏈接到第二具有共同的ID,第二個連接到第三位,另一種常見的ID,但是從第一至第三沒有共同的ID。比方說:

Table A : id, name 
Table B : id, idA, amount 
Table C : id, idB, amount 

表A.幾個數量幾個名字表B.幾個量在表C.結果想:每個A.id和A.name,與B.amount相應和,與C.amount相應的SUM。比方說:

A.id 
A.name 
SUM(B.amount) WHERE B.idA = A.id 
SUM(C.amount) WHERE C.idB = B.id for each B which B.idA = A.id 

沒事了「前三欄」和「前兩列第四」,都與一個WHERE子句和/或一個LEFT JOIN。但是我無法實現將所有第四列累積在一起而不會搞亂一切!

有人會說:「這很容易,只要把IDA列在表C」!應該更容易,當然。但它真的有必要嗎?我不這麼認爲,但我可能是錯的!因此,我就請人(誰,我會給出一個永恆「SQL上帝」飾)與SQL技能的回答笑!「這是如此簡單就做到這一點,你走了愚蠢的小新手...!」;)

運行VB 2010和MS SQL Server

感謝您的閱讀!

+0

所以,你要得到一個總和的結果集(又名一個單排)回的數據:A.id,A.name,SUM(B.amount),和(C.amount),你有多個B中與單個A.id相關的行,以及C中與B.id相關的多行? –

+0

我想我們可以這麼說,是的。但是可以肯定的是,不是「單行」,而是每個(A.id和A.name)都有一個SUM(B.amount)和SUM(C.amount)。 – Peter

回答

5

試試這個:

SELECT A.Id, A.Name, ISNULL(SUM(B.amount), 0) as bSum, ISNULL(SUM(C2.Amount), 0) as cSum 
FROM A 
LEFT OUTER JOIN B ON A.Id = B.idA 
LEFT OUTER JOIN (SELECT C.idB, SUM(C.AMOUNT) AS Amount FROM C GROUP BY C.idB) AS C2 ON C2.idB = B.Id 
GROUP BY A.Id, A.Name 
+0

感謝您的回答!已經嘗試過,給我沒有結果... – Peter

+0

@Peter嘗試我的第二個例子。 –

+0

@NathanWheeler你是對的,我已經更新了我的答案。 –

0
Select a.id, a.name, sum(b.amount), sum(c.amount) 
from a inner join b on a.id = b.idA 
inner join c on b.id = c.idB 
group by a.id, a.name 
+0

或克勞斯的回答! – dbrosier

+0

感謝你太多dbrosier,當然相同的「空」結果! – Peter

+0

這爲每個相關的C.amount算了一個額外的B.amount。 –

0

您需要單獨添加它們:

select a.id, a.name, (coalesce(b.amount, 0.0) + coalesce(c.amount, 0.0)) 
from a left outer join 
    (select b.ida, sum(amount) as amount 
     from b 
     group by b.ida 
    ) b 
    on a.id = b.ida left outer join 
    (select b.ida, sum(amount) as amount 
     from c join 
      b 
      on c.idb = b.id 
     group by b.ida 
    ) c 
    on a.id = c.ida 

的外部聯接考慮到當b和c記錄做不同時存在給定的ID。

+0

您不必對子連接進行子選擇。 –

+0

是的,你是對的。人們有奇怪的命名約定。在不同的表格中有兩個具有相同名稱的列引用不同的事物是令人困惑的。無論如何,重點是你需要兩次總結,以避免過多計算「b」。 –

+0

您的第二個子查詢中含糊不清的列名'amount' ...我想OP希望單獨的'b.amount'和'c.amount'列,而不是將兩列加在一起。 –

2

試試這個:

SELECT 
    a.id, 
    a.name, 
    sum(x.amount) as amountb, 
    sum(x.amountc) as amountc 
from a 
    left join (
     select 
      b.id, 
      b.ida, 
      b.amount, 
      SUM(c.amount) as amountc 
     from b 
     left join c 
      on b.id = c.idb 
     group by 
      b.id, 
      b.amount, 
      b.ida 
    ) x 
     on a.id = x.ida 
group by 
    a.id, 
    a.name 

這應該給你的結果集,你要尋找的。它將每個B.id的所有C.Amount相加,然後將它們一起添加到一個結果集中。我使用MSSQL中的一些示例數據對其進行了測試,並且按預期工作。

+0

我想你也測試過了,所以+1。 –