2009-09-10 8 views
3

J'ai un ensemble de tables Entity-Value et j'aimerais faire pivoter les résultats. Voici l'effet que je recherche, sauf que vous voyez que SELECT stmt utilisant Common Table Expressions ne fonctionne pas encore correctement. Ma question est la suivante: Suis-je sur la bonne voie, ou y at-il une sorte de commande de pivot facile?Question du tableau croisé dynamique SQL Server 2005

USE TempDB 
Declare @Person TABLE(
PersonID Int Identity(101,1)) 
INSERT INTO @Person DEFAULT VALUES 
INSERT INTO @Person DEFAULT VALUES 
INSERT INTO @Person DEFAULT VALUES 
INSERT INTO @Person DEFAULT VALUES 

DECLARE @Attribute TABLE(
AttributeID Int Identity(10,1) PRIMARY KEY, 
AttributeName Varchar(MAX)) 
INSERT INTO @Attribute(AttributeName) VALUES('Firstname') 
INSERT INTO @Attribute(AttributeName) VALUES('Lastname') 

DECLARE @Pat TABLE(-- A Person's Attributes 
PatID Int Identity, 
PersonID Int, 
AttributeID Int, 
PatValue Varchar(MAX) 
) 
INSERT INTO @Pat(PersonID,AttributeID,PatValue) VALUES(101,10,'John') 
INSERT INTO @Pat(PersonID,AttributeID,PatValue) VALUES(102,10,'Paul') 
INSERT INTO @Pat(PersonID,AttributeID,PatValue) VALUES(103,10,'George') 
INSERT INTO @Pat(PersonID,AttributeID,PatValue) VALUES(104,10,'Ringo') 
INSERT INTO @Pat(PersonID,AttributeID,PatValue) VALUES(101,11,'Lennon') 
INSERT INTO @Pat(PersonID,AttributeID,PatValue) VALUES(102,11,'McCartney') 
INSERT INTO @Pat(PersonID,AttributeID,PatValue) VALUES(103,11,'Harrison') 

SELECT Pat.PersonID,AttributeName,PatValue 
FROM @Pat Pat 
INNER JOIN @Person Person 
ON Pat.PersonID = Person.PersonID 
INNER JOIN @Attribute Attribute 
ON Pat.AttributeID=Attribute.AttributeID 
-- 

;WITH CTE1 AS(
    SELECT PersonID,PatValue AS FirstName 
    FROM @Pat Pat 
    INNER JOIN @Attribute Attribute 
    ON Pat.AttributeID=Attribute.AttributeID 
    WHERE AttributeName='FirstName' 
) 
,CTE2 AS(
    SELECT PersonID,PatValue AS LastName 
    FROM @Pat Pat 
    INNER JOIN @Attribute Attribute 
    ON Pat.AttributeID=Attribute.AttributeID 
    WHERE AttributeName='LastName' 
) 
SELECT Pat.PersonID,FirstName,LastName 
FROM @Pat Pat 
LEFT OUTER JOIN CTE1 
ON Pat.PersonID=CTE1.PersonID 
LEFT OUTER JOIN CTE2 
ON Pat.PersonID=CTE2.PersonID 
ORDER BY PersonID 

Je veux juste une liste des 4 personnes, avec leur prénom et nom.

+0

+1 pour le code de test réel pour recréer question –

Répondre

3

Bon exemple Here

requête dans votre cas ressemblerait à ceci:

SELECT PersonId, FirstName, LastName 
FROM 
(
    -- your query 
    SELECT Pat.PersonID,AttributeName,PatValue 
    FROM @Pat Pat 
    INNER JOIN @Person Person 
    ON Pat.PersonID = Person.PersonID 
    INNER JOIN @Attribute Attribute 
    ON Pat.AttributeID=Attribute.AttributeID 
) up 
PIVOT (MAX(PatValue) FOR AttributeName IN (FirstName, LastName)) AS pvt 
+0

Dans la clause de pivot, vous devez coder en dur "FirstName" et le nom de famille"). Cela rend la tâche difficile si les attributs que vous souhaitez récupérer et pivoter ne peuvent être déterminés qu'au moment de l'exécution. –

Questions connexes