sql >> Databáze >  >> RDS >> Sqlserver

Převeďte řádky na sloupce pomocí 'Pivot' v SQL Server

Pokud používáte SQL Server 2005+, můžete použít PIVOT funkce pro transformaci dat z řádků do sloupců.

Zdá se, že budete muset použít dynamický sql, pokud týdny nejsou známy, ale je snazší vidět správný kód zpočátku pomocí pevně zakódované verze.

Nejprve je zde několik rychlých definic tabulek a dat k použití:

CREATE TABLE yt 
(
  [Store] int, 
  [Week] int, 
  [xCount] int
);
    
INSERT INTO yt
(
  [Store], 
  [Week], [xCount]
)
VALUES
    (102, 1, 96),
    (101, 1, 138),
    (105, 1, 37),
    (109, 1, 59),
    (101, 2, 282),
    (102, 2, 212),
    (105, 2, 78),
    (109, 2, 97),
    (105, 3, 60),
    (102, 3, 123),
    (101, 3, 220),
    (109, 3, 87);

Pokud jsou vaše hodnoty známé, pak dotaz napevno zakódujete:

select *
from 
(
  select store, week, xCount
  from yt 
) src
pivot
(
  sum(xcount)
  for week in ([1], [2], [3])
) piv;

Viz SQL Demo

Pokud pak potřebujete vygenerovat číslo týdne dynamicky, váš kód bude:

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

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

set @query = 'SELECT store,' + @cols + ' from 
             (
                select store, week, xCount
                from yt
            ) x
            pivot 
            (
                sum(xCount)
                for week in (' + @cols + ')
            ) p '

execute(@query);

Viz ukázka SQL.

Dynamická verze generuje seznam week čísla, která by měla být převedena na sloupce. Oba dávají stejný výsledek:

| STORE |   1 |   2 |   3 |
---------------------------
|   101 | 138 | 282 | 220 |
|   102 |  96 | 212 | 123 |
|   105 |  37 |  78 |  60 |
|   109 |  59 |  97 |  87 |


  1. Jak deklarovat uživatelsky definovanou výjimku pomocí proměnné výjimky v databázi Oracle

  2. instalace Oracle Instantclient na Mac OS/X bez nastavení proměnných prostředí?

  3. Příklady QUARTER() – MySQL

  4. Jak vypočítat průměr sloupce a poté jej zahrnout do výběrového dotazu v oracle?