2015-10-05 24 views
1

我正在使用SQL Server 2012,並試圖使用一個Case When Group By查詢。結果給我在ProdType字段重複值。我知道這與我的分組條款有關。我的查詢是:CASE什麼時候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 

我期待看到13年5月1日與「工作」和「SVLA」及其相應的時間總共2行。非常感謝您的幫助!謝謝

回答

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; 
+0

我做了一個好辦法,以這和它的工作。 ORDER BY子句必須在子查詢之外。感謝@Rahul的幫助 – niemoy

0

查詢首先應用分組,然後才應用選擇列表中的逐行計算。如果您希望將這些行組合在一起,則您也可以在group by子句中應用相同的case表達式。