【问题标题】:CASE WHEN GROUP BY Returning Duplicate valuesCASE WHEN GROUP BY 返回重复值
【发布时间】:2016-01-02 13:29:40
【问题描述】:

我正在使用 SQL Server 2012 并尝试在 Group By 查询时使用 Case。结果在 ProdType 字段中给了我重复的值。我知道这与我的 Group by 子句有关。我的查询是:

    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 日会有 2 行显示“WORK”和“SVLA”以及它们的总相应小时数。非常感谢您的帮助!谢谢

【问题讨论】:

    标签: tsql sql-server-2012 case


    【解决方案1】:

    您应该将 HAVING 条件移动到 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;
    

    【讨论】:

    • 我对此做了一个调整,它奏效了。 ORDER BY 子句必须在子查询之外。感谢@Rahul 的帮助
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 2015-07-21
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 2021-12-22
      • 2020-09-06
      • 2017-04-19
      • 1970-01-01
      相关资源
      最近更新 更多