2012-09-23 41 views

回答

1

我试过用PIVOT,但它不起作用,因为聚合 函数。

可以使用MAX作为聚合函数,像这样:

SELECT t.StudentName, 
    MAX(CASE WHEN t.Date = '20120920' THEN t.Status END) AS '20-09-2012', 
    MAX(CASE WHEN t.Date = '20120921' THEN t.Status END) AS '21-09-2012', 
    MAX(CASE WHEN t.Date = '20120922' THEN t.Status END) AS '22-09-2012', 
    MAX(CASE WHEN t.Date = '20120923' THEN t.Status END) AS '23-09-2012' 
FROM Attendence t 
GROUP BY t.StudentName 
+0

喜马哈茂德·贾迈勒,感谢乌拉圭回合的解决方案,但我的问题是出勤日期没有预先定义它应该从日期和时间等参数生成日期 – user1645200

+0

@ user1645200请问您可以添加您的表格的结构请 –

+0

Mahmoud Gamal,Max功能在Pivot查询和工作正常再次感谢您的解决方案 – user1645200

1

你的问题让我想起了一个相似的,我不得不解决的。使用动态SQL您的问题解决了如下

-- create list of all dates 
DECLARE @dates varchar(1000) = '' 
SELECT @dates = @dates + ',[' + CAST(t.[date] as varchar)+']' 
FROM (SELECT DISTINCT [date] FROM Attendance) t 

-- remove first comma 
IF LEN(@dates)>1 SET @dates = RIGHT(@dates,LEN(@dates)-1) 


-- create query with UNPIVOT and PIVOT 
exec('SELECT 
     StudentName,'+ 
     @dates+ 
    'FROM(
     SELECT 
      [date], 
      [stat], 
      StudentName 
     FROM 
      (SELECT 
        [date], 
        [status], 
        StudentName 
       FROM 
        Attendance 
      ) AS t 
     UNPIVOT 
      (stat FOR s in ([status])) unpvt 
     ) dummy 
    PIVOT 
     (
      MAX(stat) FOR [date] in ('[email protected]+') 
     ) pvt 
    ORDER BY StudentName;'); 

也就是说SqlFiddle您的要求

0
DECLARE @DynamicPivotQuery AS NVARCHAR(max) 
DECLARE @ColumnName AS NVARCHAR(max) 

SELECT a.grno, 
     a.a_date [Date], 
     a.status, 
     s.first_name, 
     s.last_name 
INTO #pivotdata 
FROM attendance_master AS a, 
     student_master AS s 
WHERE sid = " & dd_sub.selecteditem.value & " 
     AND s.grno = a.grno 
     AND a.a_date >= '" & txtdate1.Text & "' 
     AND a.a_date <= '" & txtdate2.Text & "' 
GROUP BY a.grno, 
      a.status, 
      a.a_date, 
      s.last_name, 
      s.first_name 

SELECT @ColumnName = Isnull(@ColumnName + ',', '') 
        + Quotename([date]) 
FROM (SELECT DISTINCT [date] 
     FROM #pivotdata) AS Dates 

SET @DynamicPivotQuery = 'SELECT grno,first_name,last_name,' 
         + @ColumnName 
         + 'FROM #PivotData PIVOT(sum(status) FOR [Date] IN (' 
         + @ColumnName + ')) AS PVTTable1' 

EXEC Sp_executesql 
    @DynamicPivotQuery 

enter image description here

相关问题