2013-01-22 165 views
2

快速的问题,这让我烦恼。TSQL - 使用IN与PIVOT

在T-SQL中使用PIVOT时,'FOR..IN'部分可以引用表而不是定义的值列表吗?

例如,而不是像: -

PIVOT (Count(widgets) For Team IN ([Dave],[Peter],[John]....etc)) 

,你可以这样做: -

PIVOT (Count(widgets) for Team IN (SELECT TeamLeader FROM Teams)) 

我找不到任何引用证实了这一点是否是可能的。

+1

简短的回答,没有。你需要考虑生成动态SQL。 – Dave

+0

所以,如果不可能的话,我该如何去做这样的事情呢?一般的指针? –

+0

这是一个很好的问题,即使答案是否定的。 –

回答

2

不,这是不可能的。

PIVOT运算符的语法决定了这些数值输入为列表:

... 

IN ([first pivoted column], 

    [second pivoted column], 

... 
... 

    [last pivoted column]) 

但你可以做到这一点动态的,是这样的:

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 


select @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME(Teamleader) 
         FROM Teams 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 


SELECT @query = ' SELECT ' + @cols + 
       ' FROM AnotherTable a 
        PIVOT 
        (
        Count(widgets) For Team IN (' + @cols + ')' + 
        ') p'; 
execute(@query);