0

我有一个表变量,称为@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字段。我打算将转置表连接到该字段上的另一个表。

为了说明不同模型的不同记录数,我使用字符串连接构造了数据透视语句:

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

我得到所有模型的空值,我在 sqlfiddle 上构建了这个枢轴的玩具示例,它按预期工作。我不确定我做错了什么。

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

4

1 回答 1

5

有几件事要解决:

首先,从声明中的价值观[周围删除。specNameINSERT

其次,改变你获取列的方式。这将添加[周围的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

于 2012-08-21T21:46:03.203 回答