过滤条件时未添加SUM的问题

时间:2019-07-16 14:35:24

标签: sql sql-server tsql

我正在尝试使用SUM为基于一个字段的每个单独的部分添加3个记录集的数据,但它不是SUM,它将仅显示每个记录的结果。

我尝试将查询修改为仅限于一个没有运气的表。我尝试使用WHERE和HAVING中的条件,而未进行任何更改。如果删除条件,那么它将正确执行SUM。

SELECT dbo.tbl_Parts.Number, 
Sum(dbo.tbl_Msmt_Data.Result) AS Result, 
dbo.tbl_Parts.Parts_ID

FROM dbo.tbl_Msmt_Data INNER JOIN dbo.tbl_Parts ON dbo.tbl_Msmt_Data.Part = dbo.tbl_Parts.Parts_ID

WHERE ((dbo.tbl_Msmt_Data.Time_Completed)>GetDate()-60)

GROUP BY dbo.tbl_Parts.Number, dbo.tbl_Parts.Mold,dbo.tbl_Parts.Parts_ID, dbo.tbl_Msmt_Data.Msmt_Spec

HAVING (((dbo.tbl_Msmt_Data.Msmt_Spec)=4000 Or (dbo.tbl_Msmt_Data.Msmt_Spec)=4001 Or (dbo.tbl_Msmt_Data.Msmt_Spec)=4514))

ORDER BY dbo.tbl_Parts.Number;



What I want the output to read is: 
Number, Result 
1723      590
1724      574

But what I'm getting is: 
Number, Result 
1723      120
1723      470
1724      112
1724        0
1724      462

其他零件编号以相同的方式出现相同的模式。

2 个答案:

答案 0 :(得分:2)

您将获得更多的行,因为选择列表中有多余的列,并且您按过多的列进行分组。另外,您确实应该学习如何使用别名。它将文本墙变成一个很短且易于理解的查询。我还使用dateadd而不是简写形式来计算天数。您可能要小心一点,因为如果要日期,它可能会不准确。

我猜没有可用的示例数据,但这应该非常接近。

SELECT p.Number, 
    Sum(d.Result) AS Result 
FROM dbo.tbl_Msmt_Data d
INNER JOIN dbo.tbl_Parts  p ON d.Part = p.Parts_ID
WHERE d.Time_Completed > dateadd(day, -60, GetDate())
GROUP BY p.Number
HAVING d.Msmt_Spec in (4000, 4001, 4514)
ORDER BY p.Number;

答案 1 :(得分:0)

仅按dbo.tbl_Parts.Number分组,而不是:

GROUP BY dbo.tbl_Parts.Number, dbo.tbl_Parts.Mold, 
dbo.tbl_Parts.Parts_ID, dbo.tbl_Msmt_Data.Msmt_Spec