ピボットは列ごとに集計する必要があるため、これを行う簡単な方法はありません。入力テーブルに列を追加すると、コードが使用されている場所でコードが変更されるまでこれらの値が出力に表示されないというメンテナンスの問題が発生することを考えると、おそらくストアド プロシージャで一度実行するのが最善だと思います。入力テーブルのスキーマに基づいて、探している出力を動的に生成します。
提供されたデータを使用して、これを行う方法を示しました。このデータは一時テーブルに格納され (ストアド プロシージャは一時テーブルでは機能しないため、#temp ではありません)、次のように入力されます。
CREATE TABLE temp (
_key int,
package_name varchar(50),
cost float,
included bit
)
INSERT INTO temp VALUES(1,'Package1', 10.00, 1)
INSERT INTO temp VALUES(2,'Package2', 20.00, 0)
INSERT INTO temp VALUES(3,'Package3', 20.00, 1)
ストアド プロシージャは、@pivot_field パラメーターに基づいて値のリストを取得し、これらの値を列リストとして使用して、"Type" フィールドの後に挿入します。次に、ピボット フィールドと他のすべてのフィールドを結合して行を生成し、一度に 1 列ずつピボットします。手順は次のとおりです。
CREATE PROCEDURE usp_get_pivot (@table_name nvarchar(255), @pivot_field nvarchar(255)) AS
BEGIN
CREATE TABLE #temp (val nvarchar(max))
DECLARE @sql NVARCHAR(MAX), @cols NVARCHAR(MAX), @col NVARCHAR(255)
SET @sql = 'SELECT DISTINCT ' + @pivot_field + ' FROM ' + @table_name
INSERT INTO #temp EXEC sp_executesql @sql;
SET @cols = (SELECT '[' + val + '],' FROM #temp FOR XML PATH(''))
SET @cols = SUBSTRING(@cols, 1, LEN(@cols)-1)
SET @SQL = N'SELECT ''' + @pivot_field + ''' as [type], *
FROM (SELECT ' + @pivot_field + ', ' + @pivot_field + ' as ' + @pivot_field + '1 FROM ' + @table_name + ') AS source_table
PIVOT (max(' + @pivot_field + '1) FOR ' + @pivot_field + ' IN (' + @cols + ')) AS pivot_table'
DECLARE csr CURSOR FOR
SELECT c.name FROM sys.columns c, sys.objects o
WHERE c.object_id = o.object_id AND o.name = @table_name
AND c.name <> @pivot_field
ORDER BY column_id
OPEN csr
FETCH NEXT FROM csr INTO @col
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = @sql + ' UNION ALL
SELECT ''' + @col + ''' as [type], *
FROM (SELECT ' + @pivot_field + ', CAST(' + @col + ' AS VARCHAR) AS ' + @col + ' FROM ' + @table_name + ') AS source_table
PIVOT (max(' + @col + ') FOR ' + @pivot_field + ' IN (' + @cols + ')) AS pivot_table'
FETCH NEXT FROM csr INTO @col
END
CLOSE csr
DEALLOCATE csr
DROP TABLE #temp
EXEC sp_executesql @sql
END
手順を単純にコピーして管理スタジオに貼り付け、上記のデータを作成し、次の手順を実行できるはずです。
EXEC usp_get_pivot 'temp', 'package_name'