Dynamic 将查询透视到列的组合中

Dynamic 将查询透视到列的组合中,dynamic,sql-server-2008-r2,pivot,Dynamic,Sql Server 2008 R2,Pivot,在Sql Server 2008中,我可以从这里开始: Owner Animal Age Height Weight ----- ------ --- ------ ------ Steve Dog 8 22 60 Steve Cat 5 11 14 Steve Gerbil 2 1.5 0.3 到这里: Owner Dog_Age Dog_Height D

在Sql Server 2008中,我可以从这里开始:

Owner  Animal   Age  Height   Weight  
-----  ------   ---  ------   ------ 
Steve  Dog        8     22      60 
Steve  Cat        5     11      14 
Steve  Gerbil     2     1.5     0.3  
到这里:

Owner  Dog_Age  Dog_Height  Dog_Weight  Cat_Age  Cat_Height  ...
-----  -------  ----------  ----------  -------  ----------  ...
Steve       8           22          60        5          11  ...   
所以我正在旋转Animal列,但我想为所有可能的Animal和某些列的组合生成列。实际上没有执行任何聚合函数。因为对于我的表,可能的组合的总数将相当大,所以我想要一个解决方案,它可以避免我必须显式地键入每个结果列名,但是如果必须的话,我会这样做


我已经看过几个PIVOT命令的示例,但我没有遇到过任何通过上述组合创建列的方法,所以我不确定这是否可行。SQL Server不是我的专业领域。

如果您不关心最终输出中列的顺序:

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = N'';

SELECT 
    @sql = @sql + ',' + Animal + '_$c$ = MAX(CASE WHEN Animal = ''' 
          + Animal + ''' THEN $c$ END)'
FROM dbo.PetStuff
GROUP BY Animal;

SELECT @sql = 'SELECT Owner '
 + REPLACE(@sql, '$c$', 'Age')
 + REPLACE(@sql, '$c$', 'Height')
 + REPLACE(@sql, '$c$', 'Weight')
 + ' FROM dbo.PetStuff
 GROUP BY Owner;';

PRINT @sql;
-- EXEC sp_executesql @sql;
如果列顺序很重要(按动物名称排序,然后按字母顺序排列年龄/身高/体重),则可以将列放在表中,并生成SQL,只需稍微多做一些工作:

DECLARE @cols TABLE(col SYSNAME);
INSERT @cols SELECT 'Age' UNION ALL SELECT 'Weight' UNION ALL SELECT 'Height';

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = N'';

SELECT @sql = @sql + ',' + p.Animal + '_' + col 
  + ' = MAX(CASE WHEN Animal = ''' 
  + p.Animal + ''' THEN ' + c.col + ' END)'
FROM dbo.PetStuff AS p
CROSS APPLY @cols AS c
GROUP BY p.Animal, c.col
ORDER BY p.Animal, c.col;

SELECT @sql = 'SELECT Owner ' + @sql
 + ' FROM dbo.PetStuff
 GROUP BY Owner;';

PRINT @sql;
-- EXEC sp_executesql @sql;

如果没有动态SQL,真的想不出任何方法来实现这一点。

指定和/或标记SQL Server的版本总是很有用的。不同的版本有不同的功能。刚刚更新了我的问题-是2008 R2。