2

次のダミーコードがありました(これを使用してテストできます):

USE tempdb;
GO

CREATE TABLE dbo.Products
(
  ProductID VARCHAR (50),
  Period    VARCHAR (6),
  Value     DECIMAL (15, 2)
);
INSERT dbo.Products VALUES
('North', '201201', 100),
('South', '201202', 500);

SELECT ProductID, Period, Value
FROM dbo.Products AS p;

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Period)
  FROM (SELECT p.Period FROM dbo.Products AS p
  GROUP BY p.Period) AS x;
SET @sql = N'
SELECT * 
FROM
(
  SELECT ProductID, Period, Value
   FROM dbo.Products AS p
) AS j
PIVOT
(
  SUM(Value) FOR Period IN ('
  + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
  + ')
) AS p;';

PRINT @sql;
EXEC sp_executesql @sql;

DROP TABLE dbo.Products

出力は生成されましたが、NULL が含まれていました。ただし、列見出しは存在していました。

NULL を削除するために、私のコードは次のようになります。

USE tempdb;
GO

CREATE TABLE dbo.products
(
  ProductID VARCHAR (50),
  Period    VARCHAR (6),
  Value     DECIMAL (15, 2)
);
INSERT dbo.products VALUES
('North', '201201', 100),
('South', '201202', 500);

SELECT ProductID, Period, Value
FROM dbo.products AS p;

DECLARE @columns NVARCHAR(MAX), @selectList NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Period)
  FROM (SELECT p.Period FROM dbo.products AS p
  GROUP BY p.Period) AS x;

SET @selectList = N'';
SELECT @selectList += N', ISNULL(' + QUOTENAME(Period) + ', 0)' 
  FROM (SELECT p.Period FROM dbo.products AS p
  GROUP BY p.Period) AS x;
PRINT '@selectList = ' + @selectList
SET @selectList = STUFF(@selectlist, 1, 1, '');

SET @sql = N'
SELECT ProductId, ' + @selectList + ' 
  FROM
(
  SELECT ProductID, Period, Value
   FROM dbo.products AS p
) AS j
PIVOT
(
  SUM(Value) FOR Period IN ('
  + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
  + ')
) AS p;';

PRINT '@sql = ' + @sql;
EXEC sp_executesql @sql;

しかし今、私の列見出しには [列名なし] と表示されていますか?

見出しを元に戻すにはどうすればよいですか?

4

1 に答える 1

2

こんにちは!@selectList 変数を設定するときは、必ず「AS」を使用して列名のエイリアスを指定してください ...

SET @selectList = N'';
SELECT @selectList += N', ISNULL(' + QUOTENAME(Period) + ', 0) AS ' + QUOTENAME(Period)
  FROM (SELECT p.Period FROM dbo.products AS p
  GROUP BY p.Period) AS x;
PRINT '@selectList = ' + @selectList
SET @selectList = STUFF(@selectlist, 1, 1, '');
于 2013-05-19T17:13:12.063 に答える