2017-04-25 5 views
0

ich eine EAV Tisch entworfen, die wie folgt aussieht:SQL PIVOT Verwendung für Multi bewertet Attribute

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

SID für Betreff ID stehen, AID steht für Attribut-ID und VID steht für ValuedID

auch einen Tisch

AttributeID AttributeName 
    1   Hobbies 
    2   Name 
    3   Gender 
    4   IrisColor 

nach der Verwendung von Drehzapfen an dem ersten Tisch, verbunden mit der Attributtabelle: die Attribute abzubilden

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 

ich dieses:

SubjectID Hobbies Name Gender IrisColor 
    1  1  1  2  3 

die fast richtig, aber SubjectAttribute 1 erscheint eine in der ersten Tabelle mehr Zeit (die Hobbys ist) (SubjectDetails), also was ich erreichen möchte, ist dies:

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

ich habe zu erwähnen, dass ich nicht über egal was Separator verwendet wird, und dass ich versuchte zu tun, dass mit der Funktion STUFF, aber es ist ein Schmerz PIVOT und STUFF zu kombinieren (oder ich weiß nur nicht, wie) .. Irgendwelche Vorschläge?

+0

Sie verwenden, um Ihre Quelle EAV-Tabelle zu ändern, so dass es eine Zeile pro Attribut mit comma separated values ​​hat und schwenken dann Pivot mit Abfrage. –

+0

Ich kann nicht, dass .. die Anforderung ist separate Zeilen für jedes Attribut, auch wenn es wiederholt. Ich möchte das nur in einer Ansicht machen, aber nicht so, wie es mit Kommatrennung gespeichert wird. – berthos

Antwort

1

Dies sollte funktionieren, habe ich die folgenden: die Informationen von Ihrem EAV-Tabelle gespeichert (table1) als einzelne Zeile pro SID in eine temporary table (Sie können ein view stattdessen erstellen). geschwenkt dann wie unten, dass resultset (Pivot-Abfrage):

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

ich dieses Ergebnis bekam:

enter image description here

Bitte überprüfen Sie die vollständige Version here.

+0

Es funktioniert! Danke! – berthos

+0

sehr nett! :) glückliche Codierung! –

+0

Noch eine Frage, was ist der beste Weg, eine Ansicht zu erstellen oder die Tabelle jedes Mal neu zu erstellen? – berthos

0

Dies ohne PIVOT funktionieren würde, ich denke hier keine Notwendigkeit 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