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

Jak pivotovat data z jedné tabulky pomocí SQL serveru 2005

To lze ve skutečnosti provést docela snadno pomocí PIVOT funkce. Protože druhá odpověď nezobrazuje kód spojený s tím, jak to provést, zde jsou dva způsoby, jak PIVOT data.

První je se statickým pivotem . Statický pivot je, když víte, že se data mohou změnit na sloupce.

select *
from 
(
    select name, id, convert(char(5), dt, 101) dt, jobid, amount
    from test
) x
pivot
(
    sum(amount)
    for dt in ([01/02], [02/02], [03/02], [04/05], [05/05])
)p
order by jobid, name

Viz SQL Fiddle s ukázkou

Druhým způsobem je použití Dynamic PIVOT k identifikaci hodnot, které se mají přepnout do sloupců, za běhu.

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(5), dt, 101)) 
                    from test
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT name, id, ' + @cols + ', jobid from 
             (
                select  name, id, convert(char(5), dt, 101) dt, jobid, amount
                from test
            ) x
            pivot 
            (
                sum(amount)
                for dt in (' + @cols + ')
            ) p 
            order by jobid, name'

execute(@query)

Viz SQL Fiddle s ukázkou

Oba přinesou stejné výsledky. Dynamická funguje skvěle, když předem neznáte hodnoty pro převod na sloupce.




  1. Postgresql, Omezit aktualizaci na konkrétní sloupce (pouze pro čtení)

  2. MySQL získává řádky, ale dává přednost jedné hodnotě sloupce před jinou

  3. Vyrovnávání zatížení databáze pomocí ProxySQL a AWS Aurora

  4. Jak mohu mít v dotazu elasticsearch klauzuli MySQL IN?