2012-06-05 177 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