2017-04-25 6 views
0

属性:件名のIDを表しSQLは、私はこのようになりますEAVテーブル設計さ

SID AID VID 
1  1 1 
1  2 1 
1  3 2 
1  4 3 
1  1 2 

SIDを、AIDは、属性IDの略で、VIDは、テーブルもValuedID

の略

:属性テーブルにリンクされ、最初のテーブルの上にピボットを使用した後

AttributeID AttributeName 
    1   Hobbies 
    2   Name 
    3   Gender 
    4   IrisColor 

:属性をマップするには

SubjectID Hobbies Name Gender IrisColor 
    1  1  1  2  3 
ほとんど正しい

が、(趣味です)SubjectAttribute 1は、最初のテーブル内の1つのより多くの時間を表示されます(SubjectDetails)ので、私が達成したいことはこれです:

SELECT 
    SubjectID, 
    Hobbies, 
    Name, 
    Gender, 
    IrisColor  
FROM 
(
SELECT SubjectID, attr.AttributeName as attribute, ValueID from SubjectDetails, SubjectAttributes as attr WHERE SubjectDetails.AttributeID=attr.ID 
) as t 
PIVOT(
MAX(ValueID) 

FOR attribute IN (Hobbies,Name,Gender,IrisColor)) AS t1 

WHERE SubjectID=1 

10私はこれを取得します:

SubjectID Hobbies Name Gender IrisColor 
    1  **1,2**  1  2  3 

私は、セパレータが使用されているものを気にしないことを言及する必要があり、私はそれがあるSTUFF機能ではなく、痛みがPIVOTとSTUFFを結合することをやってみましたことを(または私は知りませんどのように)..任意の提案?

+0

を使用する必要が考えていないあなたは、あなたのソースEAVテーブルを変更することができますクエリ。 –

+0

私はそれが理由ではありません。繰り返されても、各属性に対して別々の行を持つ必要があります。私はビューでそれをするのは嫌いですが、カンマ区切りで保存するのではなくて – berthos

答えて

1

これは動作するはずです、私は次のようでした: (あなたの代わりにviewを作成することができます)temporary tableSIDごとに単一の行としてあなたEAVテーブルからの情報(table1)が格納されています。

enter image description here

が完全に動作するバージョンhereを確認してください:私はこのような結果を得た

SELECT * 
FROM 
    (
    SELECT * from #temptbl 
) as t 
PIVOT(MAX(vid) FOR attrname IN (Hobbies,Name,Gender,IrisColor)) AS t1 
WHERE sid=1 

: はその後(ごピボットクエリを使用して)以下のようにその結果セットを旋回し。

+0

それは動作します!ありがとうございました! – berthos

+0

非常にいいです! :)幸せなコーディング! –

+0

もう1つ質問がありますが、毎回ビューを作成したり、テーブルを再作成するのに最適な方法は何ですか? – berthos

0

それはカンマ区切りの値を持つ属性ごとに1行があり、その後、ピボットあなたのピボットを使用しているので、これはPIVOTを使用せずに動作します、私はここにPIVOT

SELECT SubjectID 
     ,+STUFF((SELECT ', '+CAST(ValueID AS NVARCHAR) 
       FROM @T_SubjectAttributes A 
       INNER JOIN @T_SubjectDetails B ON A.AttributeID = B.AttributeId 
       WHERE AttributeName = 'Hobbies' 
       AND B.SubjectID = H.SubjectID FOR XML PATH('')) 
         ,1,2,'') AS Hobbies 
     ,STUFF((SELECT ', '+CAST(ValueID AS NVARCHAR) 
       FROM @T_SubjectAttributes A 
       INNER JOIN @T_SubjectDetails B ON A.AttributeID = B.AttributeId 
       WHERE AttributeName = 'Name' 
       AND B.SubjectID = H.SubjectID FOR XML PATH('')) 
         ,1,2,'') AS Name 
     ,STUFF((SELECT ', '+CAST(ValueID AS NVARCHAR) 
       FROM @T_SubjectAttributes A 
       INNER JOIN @T_SubjectDetails B ON A.AttributeID = B.AttributeId 
       WHERE AttributeName = 'Gender' 
       AND B.SubjectID = H.SubjectID FOR XML PATH('')) 
         ,1,2,'') AS Gender 
     ,STUFF((SELECT ', '+CAST(ValueID AS NVARCHAR) 
       FROM @T_SubjectAttributes A 
       INNER JOIN @T_SubjectDetails B ON A.AttributeID = B.AttributeId 
       WHERE AttributeName = 'IrisColor' 
       AND B.SubjectID = H.SubjectID FOR XML PATH('')) 
         ,1,2,'') AS IrisColor 
FROM @T_SubjectDetails H 
GROUP BY SubjectID 
関連する問題