私は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
しかし、私は以下のように必要
item 1 2 3 4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
回答:
回答№1は0あなたは使うことができます GROUP BY
条件付き集計を使用して CASE
このような。
サンプルデータ
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);
クエリ
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
出力
item d1 d2 d3 d4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
編集
未知数の日付がある場合は、 dynamic pivot
このような。
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については2
つかいます 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
出力:
item 1 2 3 4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
SQL Fiddle: http://sqlfiddle.com/#!3/f097d/12/0
回答№3の場合は0
つかいます PIVOT
ピボットの概念を使用して行の値を列見出しに変換する
PIVOT
Sql Server 2005で導入された新しいリレーショナル演算子の1つです。Sql Serverでは行を列に変換する簡単なメカニズムを提供しています。
select * from tbl1 pivot(sum(amount) for [date] in([1],[2],[3],[4])) as a