如何计算P&在SQL Server中

时间:2017-07-09 09:08:26

标签: sql sql-server sql-server-2008

请帮助别人!

我有一个表View_SMS_Mark_Attendance,其中包含

等列
[Class] | [S_Adm_No] |  [Alias], | [DateTime] 

我的问题是如何像P和A一样单独计算。

Class | S_Adm_NO | Month | 1 | 2 | 3 | 4 | 5 | 6 | 7 | Total_P  | Total_A 
Nur-A | 1101     | April | A | P | P | P | P | A | A |  4       | 3
Nur-A | 1102     | April | P | P | P | P | P | A | A |  5       | 2
Nur-A | 1103     | April | A | P | A | P | P | A | A |  3       | 4

要获得我的结果,我使用的是

之类的SQL查询
SELECT * 
FROM
    (SELECT 
         [Class], [S_Adm_No], [Alias],
         DATENAME(M, [DateTime])as [Month],
         DAY([DateTime]) as [DayValue] 
     FROM   
         [View_SMS_Mark_Attendance]) AS Composite 
     PIVOT 
         (MAX([Alias])
            FOR [DayValue] IN ([1], [2], [3], [4],[5], [6], [7], [8], [9], [10], [11], [12], [13],[14],[15],[16], [17], [18], [19],
                               [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31])) AS pt 
LEFT JOIN
    (SELECT 
         [Class], [S_Adm_No], 
         SUM(CASE WHEN [Alias] = 'P' THEN 1 ELSE 0 END) AS SumOfP, 
         SUM(CASE WHEN [Alias] = 'A' THEN 1 ELSE 0 END) AS SumOfA
     FROM  
         [View_SMS_Mark_Attendance]  
     GROUP BY 
         [Class], [S_Adm_No]) AS at ON pt.[Class] = at.[Class] 
                                    AND pt.[S_Adm_No] = at.[S_Adm_No] 

我希望通过使用' WHERE month&类'

请帮助别人!

1 个答案:

答案 0 :(得分:1)

只需使用条件聚合:

SELECT [Class], [S_Adm_No], [Alias], DATENAME(MONTH, [DateTime]) as [Month],
       MAX(CASE WHEN DAY([DateTime]) = 1 THEN Alias END) as [1],
       MAX(CASE WHEN DAY([DateTime]) = 2 THEN Alias END) as [2],
       . . .,
       MAX(CASE WHEN DayValue = 31 THEN Alias END) as [31],
       SUM(CASE WHEN Alias = 'P' THEN 1 ELSE 0 END) as NumPs,
       SUM(CASE WHEN Alias = 'P' THEN 1 ELSE 0 END) as NumAs,
FROM View_SMS_Mark_Attendance
GROUP BY [Class], [S_Adm_No], [Alias], DATENAME(MONTH, [DateTime]);