Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Anzeigen von Spalten als Zeilen in SQL Server 2005

Um das gewünschte Ergebnis zu erhalten, müssen Sie zuerst UNPIVOT ausführen die Daten und dann PIVOT the DatePeriod`-Werte.

Das UNPIVOT transformiert die mehreren Spalten von Transactions , Customers und Visits in mehrere Reihen. Die anderen Antworten verwenden ein UNION ALL zu unpivot, aber SQL Server 2005 war das erste Jahr des UNPIVOT Funktion wurde unterstützt.

Die Abfrage zum Entpivotieren der Daten lautet:

select dateperiod,
  col, value
from transactions
unpivot
(
  value for col in (Transactions, Customers, Visits)
) u

Siehe Demo . Dadurch werden Ihre aktuellen Spalten in mehrere Zeilen umgewandelt, sodass die Daten wie folgt aussehen:

| DATEPERIOD |          COL | VALUE |
-------------------------------------
|   Jan 2012 | Transactions |   100 |
|   Jan 2012 |    Customers |    50 |
|   Jan 2012 |       Visits |   150 |
|   Feb 2012 | Transactions |   200 |

Da sich die Daten nun in Zeilen befinden, können Sie den PIVOT anwenden Funktion zu DatePeriod Spalte:

select col, [Jan 2012], [Feb 2012], [Mar 2012]
from
(
  select dateperiod,
    t.col, value, c.SortOrder
  from
  (
    select dateperiod,
      col, value
    from transactions
    unpivot
    (
      value for col in (Transactions, Customers, Visits)
    ) u
  ) t
  inner join
  (
    select 'Transactions' col, 1 SortOrder
    union all
    select 'Customers' col, 2 SortOrder
    union all
    select 'Visits' col, 3 SortOrder
   ) c
    on t.col = c.col
) d
pivot
(
  sum(value)
  for dateperiod in ([Jan 2012], [Feb 2012], [Mar 2012])
) piv
order by SortOrder;

Siehe SQL-Geige mit Demo .

Wenn Sie eine unbekannte Anzahl von Datumsperioden haben, verwenden Sie dynamisches SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(dateperiod) 
                    from transactions
                    group by dateperiod, PeriodNumberOverall
                    order by PeriodNumberOverall
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT col, ' + @cols + ' 
             from 
             (
                select dateperiod,
                  t.col, value, c.SortOrder
                from
                (
                  select dateperiod,
                    col, value
                  from transactions
                  unpivot
                  (
                    value for col in (Transactions, Customers, Visits)
                  ) u
                ) t
                inner join
                (
                  select ''Transactions'' col, 1 SortOrder
                  union all
                  select ''Customers'' col, 2 SortOrder
                  union all
                  select ''Visits'' col, 3 SortOrder
                 ) c
                  on t.col = c.col
            ) x
            pivot 
            (
                sum(value)
                for dateperiod in (' + @cols + ')
            ) p 
            order by SortOrder'

execute(@query)

Siehe SQL Fiddle mit Demo . Beide liefern das Ergebnis:

|          COL | JAN 2012 | FEB 2012 | MAR 2012 |
-------------------------------------------------
| Transactions |      100 |      200 |      300 |
|    Customers |       50 |      100 |      200 |
|       Visits |      150 |      300 |      600 |