2012-06-05 140 views
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 ... 

所以我旋转动物列,但要生成列为动物和某些列的所有可能的组合。实际上没有聚合功能正在执行。因为对于我的表来说,可能的组合总数会相当大,我想要一个避免我必须明确输出每个结果列名的解决方案,但是如果必须的话,我会这样做。

我已经看过几个PIVOT命令的例子,但是我没有碰到任何从上面的组合创建列的人,所以我不确定这是可能的。 SQL Server不是我的专业领域。

+0

对指定和/或使用SQL Server版本进行标记始终有用。不同版本具有不同的功能。 –

+0

刚刚更新了我的问题 - 这是2008 R2。 – Tekito

回答

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的任何方式。

+0

谢谢,我会给它一个镜头 – Tekito