Tsql 通过返回重复值进行分组时的情况

Tsql 通过返回重复值进行分组时的情况,tsql,sql-server-2012,case,Tsql,Sql Server 2012,Case,我正在使用SQL Server 2012,并尝试使用按查询分组的案例。结果在ProdType字段中提供了重复的值。我知道这与我的分组条款有关。我的问题是: SELECT CASE WHEN dbo.tblPayCode.PayCode IN (10,11,12,13,14,15,16,20,21,22,23,24,25,26,30,31,32,33,34,35,36) THEN 'WORK' WHEN dbo.tblPayCode.PayCode >

我正在使用SQL Server 2012,并尝试使用按查询分组的案例。结果在ProdType字段中提供了重复的值。我知道这与我的分组条款有关。我的问题是:

    SELECT        


CASE WHEN dbo.tblPayCode.PayCode IN (10,11,12,13,14,15,16,20,21,22,23,24,25,26,30,31,32,33,34,35,36) THEN 'WORK'
     WHEN dbo.tblPayCode.PayCode > 39 AND dbo.tblPayCode.PayCode NOT IN (40,43,57,58,59,67,68,72,75,78,79) THEN 'SVLA'
END AS ProdType,

  dbo.tblJobsWorked.WrkDate, SUM(dbo.tblJobsWorked.Hours) AS TotalHours

FROM            dbo.tblEmployees INNER JOIN
                         dbo.tblJobsWorked ON dbo.tblEmployees.EMP_NUMB = dbo.tblJobsWorked.EMP_NUMB INNER JOIN
                         dbo.tblPayCode ON dbo.tblJobsWorked.PayCode = dbo.tblPayCode.PayCode INNER JOIN
                         dbo.tblCostCenters ON dbo.tblEmployees.CC_ORGN_NUMB = dbo.tblCostCenters.CC_C_NB AND 
                         dbo.tblEmployees.ORGN_DEPT_TYP_C = dbo.tblCostCenters.DEPT_TYP_C AND dbo.tblJobsWorked.CC_RSPB_NUMB = dbo.tblCostCenters.CC_C_NB AND 
                         dbo.tblJobsWorked.RSPB_DEPT_TYP_C = dbo.tblCostCenters.DEPT_TYP_C
GROUP BY 
dbo.tblPayCode.PayCode, dbo.tblJobsWorked.WrkDate 

HAVING     dbo.tblJobsWorked.WrkDate>'2013-04-30'

ORDER BY  dbo.tblJobsWorked.WrkDate
我的结果是

ProdType    WrkDate TotalHours
WORK    2013-05-01 00:00:00.000 58.70
WORK    2013-05-01 00:00:00.000 5.20
SVLA    2013-05-01 00:00:00.000 8.00
SVLA    2013-05-01 00:00:00.000 8.00
WORK    2013-05-01 00:00:00.000 68.00
WORK    2013-05-01 00:00:00.000 825.40
WORK    2013-05-01 00:00:00.000 8.90
SVLA    2013-05-01 00:00:00.000 21.00
SVLA    2013-05-01 00:00:00.000 8.00
SVLA    2013-05-01 00:00:00.000 8.00
WORK    2013-05-01 00:00:00.000 5.30
SVLA    2013-05-01 00:00:00.000 53.00
SVLA    2013-05-01 00:00:00.000 8.60

我希望在2013年5月1日看到两行,分别是“WORK”和“SVLA”,以及它们对应的总小时数。非常感谢你的帮助!谢谢

查询首先应用分组,然后才应用选择列表中的行计算。如果要将这些行分组在一起,也可以在
group by
子句中应用相同的
大小写表达式。

您应该将
具有
条件的
移动到
的WHERE

WHERE dbo.tblJobsWorked.WrkDate>'2013-04-30'
<>你应该考虑修改你的查询,比如

SELECT ProdType, WrkDate, SUM(Hours) AS TotalHours FROM (
SELECT        
CASE WHEN dbo.tblPayCode.PayCode IN (10,11,12,13,14,15,16,20,21,22,23,24,25,26,30,31,32,33,34,35,36) THEN 'WORK'
     WHEN dbo.tblPayCode.PayCode > 39 AND dbo.tblPayCode.PayCode NOT IN (40,43,57,58,59,67,68,72,75,78,79) THEN 'SVLA'
END AS ProdType,
dbo.tblJobsWorked.WrkDate, 
dbo.tblJobsWorked.Hours

FROM            dbo.tblEmployees INNER JOIN
                         dbo.tblJobsWorked ON dbo.tblEmployees.EMP_NUMB = dbo.tblJobsWorked.EMP_NUMB INNER JOIN
                         dbo.tblPayCode ON dbo.tblJobsWorked.PayCode = dbo.tblPayCode.PayCode INNER JOIN
                         dbo.tblCostCenters ON dbo.tblEmployees.CC_ORGN_NUMB = dbo.tblCostCenters.CC_C_NB AND 
                         dbo.tblEmployees.ORGN_DEPT_TYP_C = dbo.tblCostCenters.DEPT_TYP_C AND dbo.tblJobsWorked.CC_RSPB_NUMB = dbo.tblCostCenters.CC_C_NB AND 
                         dbo.tblJobsWorked.RSPB_DEPT_TYP_C = dbo.tblCostCenters.DEPT_TYP_C

WHERE dbo.tblJobsWorked.WrkDate > '2013-04-30'
ORDER BY  dbo.tblJobsWorked.WrkDate ) xx

GROUP BY ProdType, WrkDate;

我对这个做了一个调整,它成功了。ORDERBY子句必须位于子查询之外。谢谢你的帮助@Rahul