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 は私の専門分野ではありません。

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 に答える