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
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 |
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;