Ich habe Daten in tbl1:
item date amount
a 1 10
a 2 20
a 3 30
a 4 40
b 1 20
b 2 30
b 3 40
b 4 50
c 1 30
c 2 40
c 3 50
c 4 60
Aber ich brauche wie unten
item 1 2 3 4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
Antworten:
0 für die Antwort № 1Sie können verwenden GROUP BY
mit bedingter Aggregation mit CASE
so was.
Beispieldaten
DECLARE @tbl1 TABLE (item CHAR(1),date int, amount int)
INSERT INTO @tbl1 VALUES
("a", 1, 10),
("a", 2, 20),
("a", 3, 30),
("a", 4, 40),
("b", 1, 20),
("b", 2, 30),
("b", 3, 40),
("b", 4, 50),
("c", 1, 30),
("c", 2, 40),
("c", 3, 50),
("c", 4, 60);
Abfrage
SELECT
item,
MAX(CASE WHEN date = 1 then amount END) as d1,
MAX(CASE WHEN date = 2 then amount END) as d2,
MAX(CASE WHEN date = 3 then amount END) as d3,
MAX(CASE WHEN date = 4 then amount END) as d4
FROM @tbl1
GROUP BY item
Ausgabe
item d1 d2 d3 d4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
Bearbeiten
Wenn Sie eine unbekannte Datumsnummer haben, verwenden Sie dynamic pivot
so was.
DECLARE @s NVARCHAR(MAX)
SELECT @s = STUFF((SELECT DISTINCT "," + quotename(CONVERT(VARCHAR(10),date),"[")
FROM #tbl1 for xml path("")),1,1,"")
SET @s = N"SELECT item," + @s + " FROM #tbl1 PIVOT(MAX(amount) FOR date in(" + @s + ")) as pvt"
print @s
EXEC sp_executeSQL @s
2 für die Antwort № 2
Benutzen PIVOT
SELECT item, [1], [2], [3], [4]
FROM tbl1 t
PIVOT (SUM(amount) FOR date IN ([1], [2], [3], [4])) p
SELECT item, [10], [20], [30], [40], [50], [60]
FROM tbl1 t
PIVOT (MAX(date) FOR amount IN ([10], [20], [30], [40], [50], [60])) p
AUSGABE:
item 1 2 3 4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
SQL-Geige: http://sqlfiddle.com/#!3/f097d/12/0
0 für die Antwort № 3
BENUTZEN PIVOT
Verwenden Sie das Pivot-Konzept, um Zeilenwerte als Spaltenkopf zu konvertieren
PIVOT
ist einer der neuen relationalen Operatoren, der in SQL Server 2005 eingeführt wurde. Er bietet einen einfachen Mechanismus in SQL Server, um Zeilen in Spalten umzuwandeln.
select * from tbl1 pivot(sum(amount) for [date] in([1],[2],[3],[4])) as a