web-dev-qa-db-fra.com

Pivot dynamique: somme des ventes par mois

Ma table est comme ça:

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

Ce que je veux, c'est montrer le résultat quelque chose comme ceci:

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

Comme d'autres l'ont dit, ceci est connu sous le nom de PIVOT . Il existe plusieurs façons de transformer vos données de lignes en colonnes de données.

Si vous connaissez les valeurs à l'avance, vous pouvez coder en dur les valeurs. Avant la fonction PIVOT, vous utilisiez une fonction d'agrégation avec une instruction CASE.

Version agrégée/CASE:

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;

Voir SQL Fiddle with Demo .

La fonction PIVOT a été rendue disponible dans SQL Server 2005, donc si vous utilisez cette version ou une version plus récente, vous pouvez l'appliquer à vos données.

PIVOT statique:

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

Voir SQL Fiddle with Demo

Les deux versions ci-dessus fonctionnent très bien si vous connaissez les valeurs à l'avance. Sinon, vous utiliserez le SQL dynamique pour créer le résultat.

PIVOT dynamique:

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)

Voir SQL Fiddle with Demo

Les 3 versions de ceci retourneront le même résultat:

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

Comme l'a dit Martin Smith, vous devez faire pivoter les données, que ce soit avec un PIVOT explicite comme référencé ou quelque chose comme ça (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