2009-06-26 10 views
2

salut i ont une table avec des colonnes commelignes à colonnes à l'aide de requêtes SQL

   Cost  Rate 

       Repair 12 
       Repair 223 
       Wear  1000  
       Wear  666 
       Fuel  500 
       Repair 600 
       Fuel  450 
       Wear  400 

Maintenant, je veux ces données comme

   Repair Wear Fuel 
       825  2066 950 

L'utilisation de requêtes SQL

Merci à l'avance

Répondre

0

Vous pouvez utiliser GROUP BY pour combiner les résultats lorsque vous utilisez une fonction d'agrégat telle que SUM().

SELECT Cost, SUM(Rate) FROM MyTable GROUP BY Cost 

Cela retournera les résultats inversés de ce que vous avez demandé, mais cela ne devrait pas être un gros problème, je l'espère.

 
Cost  SUM(Rate) 
---  --- 
Repair 825 
Wear  2066 
Fuel  950 
4
select sum(case when cost = 'Repair' then rate else null end) as Repair 
, sum(case when cost = 'Wear' then rate else null end) as Wear 
, sum(case when cost = 'Fuel' then rate else null end) as Fuel 
from CostRateTable 
+0

Utilisez WHEN au lieu de WHERE dans la syntaxe CASE. Et terminer un CAS avec END ou END CASE. –

+0

Ah, j'écrivais outre de la chauve-souris et n'a pas vérifié la syntaxe. Je vais arranger ça, Cheers. – glasnt

+0

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

0

coût select, somme (taux) du groupe tablename par le coût

1

La "rotation" vous voulez (faire des lignes en colonnes) peuvent être obtenus avec l'opérateur PIVOT de SQL Server.

0

Vous pouvez le faire avec une simple requête Crosstab. Il y a un assistant dans la fenêtre Requêtes d'accès qui vous guidera à travers la création d'un. Cliquez simplement sur le bouton Nouvelle requête et sélectionnez l'Assistant Requête croisée.

0

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.