2016-12-07 4 views
0

複数のコンポーネントのキー値ペアのテーブルが1つあります。各タイプのコンポーネントは異なる属性(キー)を持つことができますが、各タイプは常に同じ属性を持ちます。例えば1つの行の1つのテーブルから複数のキー値のペアを返すSQLクエリ

:Bが異なるながら

----------------------------------- 
| Comp_ID | KeyField | ValueField | 
----------------------------------- 
| A  | Size  | Big  | 
| A  | Weight | 10   | 
| A  | Colour | Green  | 
| B  | Length | Short  | 
| B  | Density | 1.5  | 
| B  | Colour | Yellow  | 
| B  | Radius | 3   | 
| C  | Size  | Small  | 
| C  | Weight | 20   | 
| C  | Colour | Red  | 
| D  | Size  | Small  | 
| D  | Weight | 20   | 
| D  | Colour | Blue  | 

A、C及びDは、成分のすべて同じタイプです。

私は次の操作を行うことができます方法:特定の属性(キー)と

  1. 選択したコンポーネントのみ。例:サイズキーを持つコンポーネントのみ。
  2. コンポーネントIDごとに1行でこれを表示します。上記の例に基づいて

私はこのようなテーブルを期待する:

------------------------------------- 
| Comp_ID | Size | Weight | Colour | 
------------------------------------- 
| A  | Big | 10  | Green | 
| C  | Small | 20  | Red | 
| D  | Small | 20  | Blue | 

ことが重要ならば、私は、Oracleデータベースを照会していますが、うまくいけば答えは、一般的なSQLになります - シンプルな、より良い:)

編集:これはデータを保存する最良の方法ではありませんが、これは私のコントロールの範囲外です - これはGEのベンダーソリューションであり、(明らかに)変更できません。私はちょうどデータを照会する必要があります。

+0

http://stackoverflow.com/questions/41003587/how-to-select-2-table-like-this/41003777?noredirect=1#comment69217373_41003777で可能な重複した質問。 – jfneis

答えて

1

条件付き集計を使用します。 'Size'が含まれていないレコードを除外するには、WHERE EXISTSを使用することもできます。

フィールド名を少し変更しました。実際には、フィールド名として予約語を使用しないでください。それは 'サイズ' のエントリを持っていないためComp_ID Bが表示されないことを

サンプルデータ

CREATE TABLE #TestData (Comp_ID varchar(1), KeyField varchar(7), ValueField varchar(6)) 
INSERT INTO #TestData (Comp_ID, KeyField, ValueField) 
VALUES 
('A','Size','Big') 
,('A','Weight','10') 
,('A','Colour','Green') 
,('B','Length','Short') 
,('B','Density','1.5') 
,('B','Colour','Yellow') 
,('B','Radius','3') 
,('C','Size','Small') 
,('C','Weight','20') 
,('C','Colour','Red') 
,('D','Size','Small') 
,('D','Weight','20') 
,('D','Colour','Blue') 

クエリ

SELECT td.Comp_ID, 
     Max(CASE WHEN td.KeyField = 'Size' THEN td.ValueField END) as Size, 
     Max(CASE WHEN td.KeyField = 'Weight' THEN td.ValueField END) as Weight, 
     Max(CASE WHEN td.KeyField = 'Colour' THEN td.ValueField END) as Colour 
FROM #TestData td 
WHERE EXISTS (SELECT * FROM #TestData td2 WHERE td2.KeyField = 'Size' AND td.Comp_ID = td2.Comp_ID) 
GROUP BY Comp_ID 

出力

Comp_ID Size Weight Colour 
A  Big  10  Green 
C  Small 20  Red 
D  Small 20  Blue 

注意してください。

+0

ありがとう@リッチ...これは両方の要件を満たすので、答えとしてマーク。 – maloo

+0

また、私が提案したようにKeyFieldとValueFieldを使用するように質問を更新しました:) – maloo

1

あなたは、これが集計

SELECT Comp_ID, 
     Max(CASE WHEN KEY = 'Size' THEN value END) as Size, 
     Max(CASE WHEN KEY = 'Weight' THEN value END) as Weight, 
     Max(CASE WHEN KEY = 'Colour' THEN value END) as Colour 
FROM yourtable 
GROUP BY Comp_ID 

Comp_IDが同じキーの複数のレコードを持つことができるなら、あなたはあなたの条件に基づいて集計(Max)を交換する必要が

それは条件付きではありません使用して行うことができますデータを格納する正しい方法、テーブル構造の変更を検討してください。 Keyごとに別々のテーブルを持つ方が良いです。

+0

私はこれがこのデータを保存するための素晴らしい方法ではないことを認識していますが、これは私のコントロールの範囲を超えています。私はちょうどデータを照会する必要があります... – maloo

関連する問題