2014-07-23 88 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