Il s'agit d'une requête simple utilisant la fonction PIVOT
. Si vous avez quelques valeurs qui sont connues pour être converties en colonnes, vous pouvez utiliser une version statique:
create table yourtable
(
cost varchar(10),
rate int
);
insert into yourtable values
('Repair', 12),
('Repair', 223),
('Wear', 1000),
('Wear', 666),
('Fuel', 500),
('Repair', 600),
('Fuel', 450),
('Wear', 400);
select *
from
(
select cost, rate
from yourtable
) x
pivot
(
sum(rate)
for cost in ([Repair], [Wear], [Fuel])
) p;
Si vous avez un nombre inconnu de valeurs, vous pouvez utiliser SQL dynamique pour créer un pivot dynamique :
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(cost)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select cost, rate
from yourtable
) x
pivot
(
sum(rate)
for cost in (' + @cols + ')
) p '
execute(@query)
Voir SQL Fiddle with Demo. Les deux produiront les mêmes résultats.
Utilisez WHEN au lieu de WHERE dans la syntaxe CASE. Et terminer un CAS avec END ou END CASE. –
Ah, j'écrivais outre de la chauve-souris et n'a pas vérifié la syntaxe. Je vais arranger ça, Cheers. – glasnt
Existe-t-il un moyen d'éviter les noms de colonne codés en dur? Lorsque quelqu'un ajoute une ligne nommée "Brakes", la requête doit être réécrite? L'approche PIVOT est plus générique mais ce n'est pas aussi simple. – Muxecoid