人々はさまざまな種類と量の果物を手に入れたいと思っており、私は彼らを助けたいと思っています. 次のようなテーブルがあります。
name fruit count temp
-----------------------------
Jim apple 3 hot
Jim banana 7 cold
Jim orange 12 cold
Sam plum 5 hot
Sam peach 1 hot
Bob cherry 4 cold
Bob banana 11 hot
Bob orange 9 cold
Bob kiwi 6 hot
各人は 1 行または 1000 行を持つことができますが、事前に何行あるかはわかりません。そのため、これには動的な列リストが必要だと思います。次のようにする必要があります。
name fruit_1 count_1 temp_1 fruit_2 count_2 temp_2 fruit_3 count_3 temp_3 fruit_4 count_4 temp_4
-------------------------------------------------------------------------------------------------------
Jim apple 3 hot banana 7 cold orange 12 cold null null null
Sam plum 5 hot peach 1 hot null null null null null null
Bob cherry 4 cold banana 11 hot orange 9 cold kiwi 6 hot
SQL 2005 の PIVOTのコードは、行数がわからない場合に 1 つの列を解析するために機能しますが、複数の列に対しては機能しません。追加@select_list
の変数を作成しようとしましたが、それを使用して列を作成できますが、必要なデータを取得できず、必要な順序を織り交ぜる方法がわかりません (例: f1、c1、t1、 f2、c2、t2 対 f1、f2、c1、c2、t1、t2 など)
微調整に失敗したコードは次のとおりです。
CREATE TABLE #stackoverflowTest(
[name] [varchar](3) NOT NULL,
[fruit] [varchar](12) NOT NULL,
[number] [int] NOT NULL,
[temp] [varchar](4) NOT NULL)
INSERT INTO #stackoverflowTest
VALUES ('Jim','apple',3,'hot'),
('Jim','banana',7,'cold'),
('Jim','orange',12,'cold'),
('Sam','plum',5,'hot'),
('Sam','peach',1,'hot'),
('Bob','cherry',4,'cold'),
('Bob','banana',11,'hot'),
('Bob','orange',9,'cold'),
('Bob','kiwi',6,'hot')
DECLARE @sql AS varchar(max)
DECLARE @pivot_list AS varchar(max)
DECLARE @select_list AS varchar(max)
SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + ']'
,@select_list = COALESCE(@select_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + '] AS [fruit_' + CONVERT(varchar, PIVOT_CODE) + ']'
FROM (
SELECT DISTINCT PIVOT_CODE
FROM (
SELECT name, fruit, number, temp, ROW_NUMBER() OVER (PARTITION BY name ORDER BY name,number) AS PIVOT_CODE
FROM #stackoverflowTest
) AS rows
) AS PIVOT_CODES
SET @sql = '
;WITH p AS (
SELECT name, fruit, number, temp, ROW_NUMBER() OVER (PARTITION BY name ORDER BY name,number) AS PIVOT_CODE
FROM #stackoverflowTest
)
SELECT name, ' + @select_list + '
FROM p
PIVOT (
MIN(fruit)
FOR PIVOT_CODE IN (
' + @pivot_list + '
)
) AS pvt
'
EXEC (@sql)