SQL从行到列的透视除了NULL值之外什么也没有

时间:2012-08-21 21:33:37

标签: sql sql-server sql-server-2008

我有一个名为@t的表变量,它是我在此定义的specsAndModel类型的一个实例:

CREATE TYPE specsAndModel AS TABLE
(
    specName VARCHAR(50)
    ,specVal VARCHAR(50)
)

执行select specName,specVal from @t会提供以下格式的数据:

specName              | specVal
--------------------------------
[modelNumber]         | F00-B4R
[Internal Switch(es)] | 2.00000
[Number of Ports]     | 1.00000
[Color Insulator]     | Yellow

我插入了第一行,这样当我转置表时,会有一个modelNumber字段。我打算将转置表加入该字段中的另一个表。

为了考虑不同模型的不同数量的记录,我使用字符串连接构建了pivot语句:

DECLARE @cols NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);
SELECT @cols = COALESCE(@cols + ',' + specName, specName) FROM @t;

SET @query = N'SELECT ' + @cols 
+ N' FROM @var src' 
+ N' PIVOT (MAX(specVal) FOR specName in (' + @cols + N')) pvt;';

查询字符串如下所示:

SELECT [modelNumber],[Internal Switch(es)],[Number of Ports],[Color Insulator] 
FROM @var src 
PIVOT 
(
  MAX(specVal) 
  FOR specName in ([modelNumber],[Internal Switch(es)],[Number of Ports],[Color Insulator])
) pvt;

最后,我使用sp_executesql传递@t变量,然后执行@query字符串:

EXEC sp_executesql @query, N'@var specsAndModel readonly', @t

结果如下:

[modelNumber] | [Internal Switch(es)] | [Number of Ports] | [Color Insulator]
-----------------------------------------------------------------------------
NULL          | NULL                  | NULL              | NULL

我得到了所有模型的空值,我构建了一个这个视角here on sqlfiddle的玩具示例,它按预期工作。我不确定我做错了什么。

如何在不获取空值的情况下转置此表?

1 个答案:

答案 0 :(得分:4)

要解决的一些问题:

首先,移除[声明中specName值周围的INSERT

其次,改变你的列的方式。这会在[值周围添加specName

DECLARE @cols NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(specName) 
                    from @t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

如果你这样做,那么你的脚本将起作用:

DECLARE @cols NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(specName) 
                    from @t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = N'SELECT ' + @cols 
+ N' FROM @var src' 
+ N' PIVOT (MAX(specVal) FOR specName in (' + @cols + N')) pvt;';

EXEC sp_executesql @query, N'@var specsAndModel readonly', @t

请参阅SQL Fiddle with Demo