/ /列に列を含むクエリ - sql、sql-server、sql-server-2008、ピボット

行を列としてクエリする - sql、sql-server、sql-server-2008、ピボット

私は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