0

在 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 列,但想为动物和某些列的所有可能组合生成列。实际上没有执行聚合函数。由于对于我的表,可能的组合总数将相当大,我想要一个解决方案,避免我必须明确输入每个结果列名,但如果我必须这样做,我会这样做。

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

4

1 回答 1

1

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

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,真的想不出任何方法来做到这一点。

于 2012-06-05T19:38:40.380 回答