2009-09-10 12 views
3

У меня есть набор таблиц сущностей и вы хотите изменить результаты. Вот этот эффект, который я ищу, за исключением того, что SELECT stmt с использованием общих табличных выражений работает не совсем правильно. Мой вопрос: Я на правильном пути, или есть какая-то легкая сводная команда?Вопрос о сводной таблице 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 

Я просто хочу список из 4 человек, с их первым именем и фамилией.

+0

+1 для фактического тестового кода, чтобы воссоздать вопрос –

ответ

3

Хороший пример Here

Запрос в вашем случае будет выглядеть следующим образом:

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

В пункте поворота, вы должны упорно-код «FirstName» и "LastName"). Это затрудняет работу, если атрибуты, которые вы хотите получить, и ось вращения могут быть определены только во время выполнения. –