2014-07-23 131 views
0

我在CheckLine表中提供了信息,它基本上分解了特定支票上的各種費用和信息。對於這個查詢,我想彙總CheckLine的總數,但是它將所有CheckLine一起提供SUM。我知道我錯過了一些明顯的東西,但我一直在爲我個人化SUM而撓頭。這裏是我的查詢:SUM子查詢每行的總金額

SELECT DISTINCT 
O.FileNumber 
,(SELECT DISTINCT 
     SUM(CL.Amount) 
    FROM 
     dbo.Orders O 
     LEFT JOIN dbo.Checks C 
      ON O.OrdersID = C.OrdersID 
     LEFT JOIN dbo.CheckLine CL 
      ON C.ChecksID = CL.ChecksID 
) AS 'Total' 
FROM 
dbo.Orders O 
LEFT JOIN dbo.Checks C 
    ON O.OrdersID = C.OrdersID 
LEFT JOIN dbo.CheckLine CL 
    ON C.ChecksID = CL.ChecksID 

這是它返回:

| FileNumber | … | Total | 
|  1  | | 2000 | 
|  2  | | 2000 | 

它應該是什麼返回是:

| FileNumber | … | Total | 
|  1  | | 700 | 
|  2  | | 1300 | 

我的全腦放屁的思考嗎?多謝你們!

回答

0
SELECT 
    O.FileNumber, 
    O.CloseDate, 
    SUM(CL.Amount) as Total 
FROM dbo.Orders O 
    LEFT JOIN dbo.Checks C 
     ON O.OrdersID = C.OrdersID 
    LEFT JOIN dbo.CheckLine CL 
     ON C.ChecksID = CL.ChecksID 
GROUP BY O.FileNumber, O.CloseDate 

當您在一個子查詢計算Total,該值將被視爲由SQL Server將重複每一行恆定。

這是很常見混淆GROUP BYDISTINCT(請看herehere),因爲它們返回相同的值,如果沒有聚合函數是SELECT子句。在您的例子:如果你是想聚集信息(如您的現場TOTAL

SELECT DISTINCT FileNumber FROM ORDERS 

將返回相同的

SELECT FileNumber FROM ORDERS GROUP BY FileNumber 

使用GROUP BY

+0

這個問題,我也選擇其他領域,所以當我嘗試「GROUP BY」我收到彙總錯誤:「列'dbo.Orders.CloseDate'在選擇列表中無效,因爲它不是包含在一個集合函數或GROUP BY子句中。「這就是我試圖做子查詢的原因。 – PicoDeGallo

+0

黃金法則是:沒有被聚合的'SELECT'中的每一列都應該在'GROUP BY' – Nizam

+0

我編輯了我的答案來回答你的評論。你想得到每個FileNumber和CloseDate的總和嗎?如果是這樣,查詢中的版本可以解決您的問題。如果不是的話,可能你會想用'MAX'或'MIN'函數來聚合'CloseDate'too。 – Nizam

0

你可能想這樣的:

SELECT O.FileNumber, SUM(CL.Amount) as total 
    FROM dbo.Orders O 
    LEFT JOIN dbo.Checks C 
    ON O.OrdersID = C.OrdersID 
    LEFT JOIN dbo.CheckLine CL 
    ON C.ChecksID = CL.ChecksID 
group by O.FileNumber