2009-09-10 122 views
3

我有一个Entity-Value集合的表,并且希望透视结果。 以下是我正在寻找的效果,除非您看到使用公用表表达式的SELECT语句不能正确工作。 我的问题是:我在正确的轨道上,还是有一些简单的枢轴命令?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实际测试代码重现问题 – 2009-09-10 21:25:42

回答

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

在枢轴条款,你必须硬编码“姓”和“LastName”)。如果要检索的属性和数据透视只能在运行时确定,这很难实现。 – 2009-09-10 21:57:59