2016-07-06 9 views
1

2つのテーブルがあります。すなわちSQL - 行を結合しながらテーブル間でデータを照合します。

表1:

RecordId RecordDescription 
1   Red 
2   Green 
3   Blue 

表2:

RecordID FieldID FieldValue 
1   10  3.1 
1   20  2.8 
1   30  4.2 
2   20  3.8 
3   10  6.6 
3   30  5.5 

私のようなものに見える組み合わせたテーブルを生成したいと思います: 表3を:

RecordID Field10Value Field20Value Field30Value 
1    3.1   2.8   4.2 
2        3.8 
3    6.6       5.5 

これはそれのように思えますかなりストレートでなければならないが、私は自分自身をサークルで運転し続けている。

それは私が使用することができるはずのように感じている:

SELECT * FROM (
    SELECT RecordID, Field10Value, Field20Value, Field30Value FROM (
    SELECT MAX(CASE WHEN FieldID=10 THEN FieldValue ELSE NULL END) as Field10Value, 
    SELECT MAX(CASE WHEN FieldID=20 THEN FieldValue ELSE NULL END) as Field20Value, 
    SELECT MAX(CASE WHEN FieldID=30 THEN FieldValue ELSE NULL END) as Field30Value 
    FROM Table2)) JOIN Table1 on RecordID 

をしかし、私は私の構文の権利を取得するように見えることができないとはるかにエレガントな方法があるかもしれないようにそれはそう(私は実際には非常に持っていますいくつかのFieldID値...)

ご協力いただければ幸いです。 私は実際にExcelのVBA呼び出しからこれを行うことを試みているので、単一のクエリ呼び出しが理想的です。

+0

データベースはどのように動作していますか? –

+0

正直、わかりません。 Excel 2010内でVBAからADODB呼び出しを使用してアクセスしています。「プロバイダ」は「SQLOLEDB」です。私はそれがMicrosoft SQL Serverだと確信しています。 – Robert

答えて

0

これはテーブルピボットと呼ばれます。一部のデータベースはpivot節をサポートしています。あなたはconditional aggregationを使用しています。あなたがfieldid値の最大数がわからない場合、あなたはおそらくdynamic sqlを使用を検討する必要があります

select t1.recordid, t1.recorddescription, 
     max(case when t2.fieldid = 10 then t2.fieldvalue end) as field10value, 
     max(case when t2.fieldid = 20 then t2.fieldvalue end) as field20value, 
     max(case when t2.fieldid = 30 then t2.fieldvalue end) as field30value 
from table1 t1 
     join table2 t2 on t1.recordid = t2.recordid 
group by t1.recordid, t1.recorddescription 

:ここ

はあなたが後におそらくだものです。

+0

うん!これは魅力的に機能しました。私はGROUP BYが間違っていて、テーブルのエイリアシングを試しましたが、私はそれが正しいとは確信していません。どうもありがとう!!! – Robert

関連する問題