2

表1

| MODULE | COUNT | YEAR |
-------------------------
|     M1 |    12 | 2011 |
|     M1 |    43 | 2012 |
|     M2 |     5 | 2011 |
|     M3 |    24 | 2011 |
|     M4 |    22 | 2011 |
|     M4 |    11 | 2012 |
|     M5 |    10 | 2012 |

こんな感じで表示したい

| MODULE |   2011 |   2012 |
----------------------------
|     M1 |     12 |     43 |
|     M2 |      5 |     -  |
|     M3 |     24 |     -  |
|     M4 |     22 |     11 |
|     M5 |     -  |     10 |
4

4 に答える 4

1

そのためにPIVOTを使用できます。

SELECT 
  Module,
  [2011], [2012]
FROM
  (
  SELECT 
    *  
  FROM Table1
  ) AS SourceTable
PIVOT
  (
  SUM([Count])
  FOR [Year] IN ([2011], [2012])
  ) AS PivotTable;

制限がない場合は、この動的クエリを使用することもできますYear

DECLARE @cols AS NVARCHAR(MAX), @query  AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME([Year]) 
                    from Table1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = 'SELECT Module,' + @cols + ' 
             FROM
             (
                Select *
                FROM Table1
             ) dta
             PIVOT
             (
                SUM([Count])
                FOR [Year] IN (' + @cols + ')
             ) pvt '
EXECUTE(@query);

結果:

| MODULE |   2011 |   2012 |
----------------------------
|     M1 |     12 |     43 |
|     M2 |      5 | (null) |
|     M3 |     24 | (null) |
|     M4 |     22 |     11 |
|     M5 | (null) |     10 |

このSQLFiddleを参照してください


アップデート

この代替の動的メソッドを使用することもできます: ( @valexによって指定されたクエリの動的)

DECLARE @cols AS NVARCHAR(MAX), @query  AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT distinct ',' 
                      + ' SUM(CASE WHEN YEAR= ''' + CAST(Year AS varchar(50))
                      + ''' THEN [COUNT] ELSE ''-'' END) AS ' + QUOTENAME([Year])
                    from Table1
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


SET @query = 'SELECT Module, ' + @cols + ' 
             FROM Table1 GROUP BY Module'
EXECUTE(@query);

このSQLFiddleを参照してください

于 2013-08-23T07:45:04.313 に答える
0
SELECT *
FROM   Tablename
PIVOT  (
       AVG([Count] FOR [Year] IN (2011, 2012, 2013)) AS AvgCount
)
于 2013-08-23T07:33:58.343 に答える