2016-06-29 18 views
0

私は前に条件付き集計に関して質問しました。 SQL Transform Crosstab Pivotと答えは素晴らしかったです!しかし、私はこれを拡張する必要があります。一度手動入力ではなく条件集計参照テーブル

ソリューションは、次のクエリた:

SELECT 
    Item, 
    [X] = MAX(CASE WHEN [Columns] = 'X' THEN Result END), 
    [Y] = MAX(CASE WHEN [Columns] = 'Y' THEN Result END), 
    [Z] = MAX(CASE WHEN [Columns] = 'Z' THEN Result END) 
FROM thisTable 
GROUP BY Item 

質問:私は今の行でW、X、Y、ZとテーブルTESTを持っています。クエリに別の行([W] = MAX(CASE WHEN [Columns] = 'W' THEN Result END))を追加する代わりに、上記のクエリを値の表を参照するように書き直すことはできますか?

これは、W、X、Y、Z以上のものがあり、今後このクエリに行を追加したくないことが予想されるためです。

+2

あなたは、動的ピボットを使用する必要があります。[この質問](http://stackoverflow.com/questions/18657214/sql-server-dynamic-pivot-over-5-columns?rq=1)が役立つかもしれません君は。 –

答えて

1

条件付き集計を使用したい場合は、このように動的にクエリを作成することができます。

DECLARE @Columns NVARCHAR(MAX), 
     @Sql NVARCHAR(MAX) 

SELECT @Columns = STUFF((
    SELECT ',' + CONCAT(QUOTENAME([Columns]), ' = MAX(CASE WHEN [Columns] = ''', [Columns], ''' THEN Result END)') 
    FROM thisTable 
    GROUP BY [Columns] -- distinct 
    ORDER BY [Columns] -- order column names 
    FOR XML PATH('') 
), 1, 1, '') 

SET @Sql = N' 
    SELECT Item, 
      ' + @Columns + ' 
    FROM thisTable 
    GROUP BY Item 
' 
EXEC(@Sql) 

TESTの説明を列名として使用する場合は、これを使用できます。

SELECT @Columns = STUFF((
    SELECT ',' + CONCAT(QUOTENAME([Description]), ' = MAX(CASE WHEN [Columns] = ''', [Columns], ''' THEN Result END)') 
    FROM TEST 
    FOR XML PATH('') 
), 1, 1, '') 
+0

ニース、これは私が欲しいものをするように見えます。しかし、私は値の代わりにこれらの列の説明を持つテーブル 'TEST'を持っています。私は代わりに列の説明を取得できるかどうかを確認するために、最初のSELECTステートメントでこのテストテーブルに参加しようとしましたが、エラーが発生しました...どのように私はこの 'TEST'テーブルに参加することができますか? – Peter

+0

あなたは今私が持っているものを見せることができますか?少なくともテーブルスキーマ – JamieD77

+0

結果にはItem、W、X、Y、Zという列があります。私の 'TEST'テーブルにはColumn、Descriptionという2つのカラムがあります。列には4行、W、X、Y、Zがあり、説明には4行、Description1、Description2、Description3、Description4があります。私は元のクエリでW、X、Y、Zの代わりに列に説明を表示する結果の表を取得しようとしています。 – Peter