2009-06-26 7 views

Antwort

0

Sie können GROUP BY verwenden, um Ergebnisse zu kombinieren, wenn Sie eine Aggregatfunktion wieverwenden.

Dies wird die Ergebnisse invertiert von dem, was Sie angefordert haben, aber das sollte keine große Sache sein, hoffe ich.

 
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

Verwenden Sie WHEN anstelle von WHERE innerhalb der CASE-Syntax. Und beende einen CASE mit END oder END CASE. –

+0

Ah, ich habe das geschrieben und habe die Syntax nicht überprüft. Ich werde es reparieren, Prost. – glasnt

+0

Gibt es eine Möglichkeit, hartcodierte Spaltennamen zu vermeiden? Wenn jemand eine Zeile namens "Bremsen" hinzufügt, muss die Abfrage neu geschrieben werden? Der PIVOT-Ansatz ist generischer, aber nicht so einfach. – Muxecoid

0

wählen Kosten, sum (Rate) von Tabellennamen Gruppe von Kosten

1

Die "Rotation" Sie wollen (was Zeilen in Spalten) mit SQL Server PIVOT Operator erhalten werden.

0

Sie können dies mit einem einfachen Crosstab Abfrage. Im Fenster Zugriffsabfragen befindet sich ein Assistent, der Sie durch die Erstellung eines Assistenten führt. Klicken Sie einfach auf die Schaltfläche Neue Abfrage und wählen Sie den Kreuztabellen-Abfrage-Assistenten.

0

Dies ist eine einfache Abfrage mit der Funktion PIVOT. Wenn Sie ein paar Werte haben, die Spalten umgewandelt dafür bekannt sind, dann können Sie eine statische Version verwenden:

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; 

Wenn Sie eine unbekannte Anzahl von Werten haben, dann können Sie die dynamische SQL verwenden, um eine dynamische Dreh zu erstellen :

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) 

Siehe SQL Fiddle with Demo. Beides wird zu denselben Ergebnissen führen.

Verwandte Themen