2017-01-25 9 views
1

特定の行のみが列になるようにデータベースをピボットしようとしています。以下は私のテーブルには、次のようになります。SQLピボットのみ行を選択する

ID QType  CharV  NumV 
1 AccNum     10 
1 EmpNam  John Inc 0 
1 UW   Josh  0 
2 AccNum     11 
2 EmpNam  CBS   0 
2 UW   Dan   0 

私はこのようにするためにテーブルをしたいと思います:

​​

私は、私が説明するためにしようとしています二つの主要な問題を抱えています。

1番目:取得しようとしている値が必ずしも同じ列にあるとは限りません。 AccNumは常にNumV列にありますが、EmpNameは常にCharV列にあります。

第2回:私が望まないデータを無視する方法を見つける必要があります。この例では、QType列にUWの行があります。以下は

は、私が持っているコードです:

SELECT * 
    FROM testTable 
    Pivot(
    MAX(NumV) 
    FOR[QType] 
    In ([AccNum],[TheValue]) 
    )p 

をしかし、それは私に、以下の結果を与えている:動作するはずの条件付き集約してグループ化する。この場合

ID CharV AccNum TheValue 
1   10  NULL 
2   11  NULL 
2 CBS  NULL NULL 
2 Dan  NULL NULL 
1 John IncNULL NULL 
1 Josh NULL NULL 

答えて

3

SELECT ID 
, MAX(CASE WHEN QType = 'AccNum' THEN NumV END) AS AccNum 
, MAX(CASE WHEN QType = 'EmpNam' THEN CharV END) AS EmpNam 
FROM testTable 
GROUP BY ID 

WHEN条件が満たされたときに内側のCASEのみが値を取得するため、MAX関数は必要な値を与えます。これはもちろん、IDごとに一意のQTypesしかない限り動作します。

一般的に、Sql-ServerでPIVOTを使用すると、条件が複雑な場合、特に異なる列の値が必要な場合、1つのステップでは機能しません。テーブルを2つのクエリでピボットして結合することはできますが、パフォーマンスが悪く、私の提案より読みにくくなります。

+1

ありがとう、これは完璧に機能しました!私はあなたに私が欲しいと思ったものではなく、最も簡単で簡単な答えを私に与えてくれてありがとう。 –