Dynamic 将查询透视到列的组合中
在Sql Server 2008中,我可以从这里开始: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
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。