1

attendance学生の出席日と出席状況を含むテーブルがあります。

次のような要約を表示する方法はありますか。

Student 20-09-2012 21-09-2012 22-09-2012 23-09-2012
  xyz       P          A          P           P
  abc       P          P          P           P

SQL Server クエリを介して?

で試しましたPIVOTが、集計関数のために機能しません。

4

3 に答える 3

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
于 2012-09-23T08:56:55.637 に答える
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 ('+@dates+')
        ) pvt
    ORDER BY StudentName;');

それはあなたの要求のためのSqlFiddleです

于 2012-09-23T10:56:39.113 に答える