返回错误总和的SQL GROUP BY函数
我一直在研究这个问题,研究我可能做错了什么,但我似乎无法在我编写的代码中找到答案或错误。我目前正在从一个MS SQL Server数据库提取数据,其中有一个WHERE子句成功地将结果筛选为我想要的结果。每个员工大约有4行,我想加上一个值列。当我将GROUPBY子句与员工ID相加,并将总和与值相加时,我得到了一个完全错误的数字。我怀疑SQL代码忽略了我的WHERE子句 以下是一小部分数据:返回错误总和的SQL GROUP BY函数,sql,sql-server,group-by,sum,Sql,Sql Server,Group By,Sum,我一直在研究这个问题,研究我可能做错了什么,但我似乎无法在我编写的代码中找到答案或错误。我目前正在从一个MS SQL Server数据库提取数据,其中有一个WHERE子句成功地将结果筛选为我想要的结果。每个员工大约有4行,我想加上一个值列。当我将GROUPBY子句与员工ID相加,并将总和与值相加时,我得到了一个完全错误的数字。我怀疑SQL代码忽略了我的WHERE子句 以下是一小部分数据: hr_empl_code hr_doll_paid 1 20.5 1
hr_empl_code hr_doll_paid
1 20.5
1 51.25
1 102.49
1 560
我希望GROUP BY and SUM子句会给我734.24的值。我得到的值是211461.12。通过故障排除,我在查询中添加了一个COUNT(*)列,计算出它运行的行数,结果是1152,进一步强化了我的信念,即它忽略了WHERE子句
我的SQL代码如下所示。其中大部分都是由我运行它的前端应用程序生成的,因此我相信其中还有一些额外的代码可以帮助查询
SELECT DISTINCT
T000.hr_empl_code,
SUM(T175.hr_doll_paid)
FROM
hrtempnm T000,
qmvempms T001,
hrtmspay T166,
hrtpaytp T175,
hrtptype T177
WHERE 1 = 1
AND T000.hr_empl_code = T001.hr_empl_code
AND T001.hr_empl_code = T166.hr_empl_code
AND T001.hr_empl_code = T175.hr_empl_code
AND T001.hr_ploy_ment = T166.hr_ploy_ment
AND T001.hr_ploy_ment = T175.hr_ploy_ment
AND T175.hr_paym_code = T177.hr_paym_code
AND T166.hr_pyrl_code = 'f' AND T166.hr_paid_dati = 20180404
AND (T175.hr_paym_type = 'd' OR T175.hr_paym_type = 't')
GROUP BY T000.hr_empl_code
ORDER BY hr_empl_code
我真的不知道哪里会出错。我去掉了额外的WHERE和,把它降到了T166.hr_emp_code=T175.hr_emp_code,但它没有什么不同
我绝对不是SQL Server和查询方面的专家,但我对这项技术有相当的掌握。任何帮助都将不胜感激 分组方式没有错,您如何使用它是错误的
SELECT
T000.hr_empl_code,
T.totpaid
FROM
hrtempnm T000
inner join (SELECT
hr_empl_code,
SUM(hr_doll_paid) as totPaid
FROM
hrtpaytp T175
where hr_paym_type = 'd' OR hr_paym_type = 't'
GROUP BY hr_empl_code
) T on t.hr_empl_code = T000.hr_empl_code
where exists
(select * from qmvempms T001,
hrtmspay T166,
hrtpaytp T175,
hrtptype T177
WHERE T000.hr_empl_code = T001.hr_empl_code
AND T001.hr_empl_code = T166.hr_empl_code
AND T001.hr_empl_code = T175.hr_empl_code
AND T001.hr_ploy_ment = T166.hr_ploy_ment
AND T001.hr_ploy_ment = T175.hr_ploy_ment
AND T175.hr_paym_code = T177.hr_paym_code
AND T166.hr_pyrl_code = 'f' AND T166.hr_paid_dati = 20180404
)
ORDER BY hr_empl_code
注意:如果您使用了连接,而不是旧式的where连接,那就更清楚了。今天的提示:切换到现代的显式
JOIN
语法。更易于编写(无错误),更易于阅读(和维护),并且在需要时更易于转换为外部联接。您很少会将选择不同的和分组方式
组合在一起。(您的分组依据不返回重复项。)添加一些示例表数据和预期结果。作为格式化文本,而不是图像。@a_horse_和_no_name-当然,这在我发帖时(显然)没有想到。编辑问题以供澄清@jarlh-我绝不是DBA,只是对许多不同的脚本语言有一定的了解,所以我不了解现代标准。我以前使用过JOIN
,但我不知道在这种情况下它是必要的。使用SELECT DISTINCT
和GROUP BY
时也一样。样本数据和预期结果包含在初始问题中。非常感谢您@Cetin的帮助。我绝不是DBA,我在问题中已经澄清了这一点,因此我不知道JOIN
vsWHERE
的用法。在编辑我的问题之前,我已经提到过,但可能不是很清楚,在我添加分组之前,前端应用程序生成了大部分初始代码。我已经测试了你的代码,它在解决方案中运行良好,再次感谢!