丢失了我的列标题SQL

时间:2013-05-19 16:03:23

标签: sql sql-server alias

我有以下虚拟代码(您可以使用它来测试):

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;

但现在我的列标题显示[无列名]?

如何取回标题?

1 个答案:

答案 0 :(得分: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, '');
相关问题