返回错误总和的SQL GROUP BY函数

返回错误总和的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

我一直在研究这个问题,研究我可能做错了什么,但我似乎无法在我编写的代码中找到答案或错误。我目前正在从一个MS SQL Server数据库提取数据,其中有一个WHERE子句成功地将结果筛选为我想要的结果。每个员工大约有4行,我想加上一个值列。当我将GROUPBY子句与员工ID相加,并将总和与值相加时,我得到了一个完全错误的数字。我怀疑SQL代码忽略了我的WHERE子句

以下是一小部分数据:

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
vs
WHERE
的用法。在编辑我的问题之前,我已经提到过,但可能不是很清楚,在我添加分组之前,前端应用程序生成了大部分初始代码。我已经测试了你的代码,它在解决方案中运行良好,再次感谢!