Sql 每行总金额的SUM子查询
我在支票行表格中有一些信息,基本上分解了各种费用和特定支票的信息。对于这个查询,我想求校验行的总和,但它给出的是所有校验行的总和。我知道我漏掉了一些显而易见的东西,但我一直在琢磨为什么我要个性化计算。我的问题是:Sql 每行总金额的SUM子查询,sql,Sql,我在支票行表格中有一些信息,基本上分解了各种费用和特定支票的信息。对于这个查询,我想求校验行的总和,但它给出的是所有校验行的总和。我知道我漏掉了一些显而易见的东西,但我一直在琢磨为什么我要个性化计算。我的问题是: SELECT DISTINCT O.FileNumber ,(SELECT DISTINCT SUM(CL.Amount) FROM dbo.Orders O LEFT JOIN dbo.Checks C
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 |
关于我的大脑放屁的想法?谢谢大家 您可能想要这样:
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
在子查询中计算Total
时,SQL Server会将该值视为常量,并重复每一行
将GROUP BY
与DISTINCT
混淆是很常见的(请查看和),因为如果SELECT
子句中没有聚合函数,它们返回相同的值。在您的示例中:
SELECT DISTINCT FileNumber FROM ORDERS
将返回相同的
SELECT FileNumber FROM ORDERS GROUP BY FileNumber
如果您希望聚合信息(如您的字段
总计
),请使用分组依据
。问题在于,我还选择了其他字段,因此当我尝试分组依据
时,我收到聚合错误:“列'dbo.Orders.CloseDate'在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。
“这就是我尝试执行子查询的原因。黄金法则是:SELECT
中未聚合的每一列都应位于groupby
中。我已编辑了我的答案以回答您的评论。您想知道每个文件号和关闭日期的总和吗?如果是这样,查询中的版本将解决您的问题。如果没有,您可能也希望使用MAX
或MIN
函数聚合CloseDate
。谢谢@Nizam。因为我选择了多个字段,所以我最终按照文件号和CloseDate进行分组,并将一个MAX()
聚合放置到我的每个其他选择字段中,因为这些字段都只是重复。我感谢你的帮助!
SELECT FileNumber FROM ORDERS GROUP BY FileNumber