it-swarm-eu.dev

Dynamický pivot: součet tržeb za měsíc

Můj stůl je takový:

Sitecode    Month  Amount
--------    -----  ------
XX          Jan     1000
XX          Jan     3000
XX          Apr     3000
XX          Apr     1000

Chci, abych ukázal výsledek něco takového:

Sitecode    MonthJAN   MonthAPR
--------    --------   --------
XX          4000       4000
4
user16947

Jak říkali ostatní, je to známé jako PIVOT . Existuje několik způsobů, jak můžete transformovat svá data z řádků do sloupců dat.

Pokud tyto hodnoty znáte předem, můžete je pevně zakódovat. Před funkcí PIVOT byste použili agregovanou funkci s příkazem CASE.

Agregovaná/CASE verze:

select sitecode,
  sum(case when [month] = 'Jan' then amount else 0 end) MonthJan,
  sum(case when [month] = 'Apr' then amount else 0 end) MonthApr
from yourtable
group by sitecode;

Viz SQL Fiddle s Demo .

Funkce PIVOT byla zpřístupněna v SQL Server 2005, takže pokud používáte tuto verzi nebo novější, můžete ji použít pro vaše data.

Statický PIVOT:

select *
from
(
  select sitecode,
    [month],
    amount
  from yourtable
) src
pivot
(
  sum(amount)
  for month in (Jan, Apr)
) piv;

Viz SQL Fiddle s Demo

Výše uvedené dvě verze fungují skvěle, pokud znáte hodnoty předem. Pokud ne, použijete k vytvoření výsledku dynamický SQL.

Dynamic PIVOT:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(month) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT sitecode,' + @cols + ' from 
             (
                select sitecode, [month], amount
                from yourtable
            ) x
            pivot 
            (
                sum(amount)
                for month in (' + @cols + ')
            ) p '

execute(@query)

Viz SQL Fiddle s Demo

Všechny 3 verze tohoto vrátí stejný výsledek:

| SITECODE |  JAN |  APR |
--------------------------
|       XX | 4000 | 4000 |
18
Taryn

Jak řekl Martin Smith, je třeba data otáčet, ať už se jedná o explicitní PIVOT, nebo jako něco podobného (SQL Fiddle) :

SELECT SiteCode
   , SUM(Case When Month='Jan' Then Amount Else 0 End) MonthJan
   , SUM(Case When Month='Apr' Then Amount Else 0 End) MonthApr
FROM Result GROUP BY SiteCode;
9
Leigh Riffel