SQL数据透视表

时间:2009-08-07 14:26:07

标签: sql sql-server

有没有办法透视实体属性表? 我想将所有行翻转成列,无论有多少不同的属性。

这是我想要完成的一个例子。该示例使用两个属性:FirstName,LastName。但是在真实数据库中,有数千个属性,我想将它们翻转成列用于报告目的。

我不想为每个属性都写一个CTE。

USE TempDB
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 @tbl TABLE(
AttributeID Int,
EntityValue Varchar(MAX)
)
INSERT INTO @tbl(AttributeID,EntityValue) VALUES(10,'John')
INSERT INTO @tbl(AttributeID,EntityValue) VALUES(10,'Paul')
INSERT INTO @tbl(AttributeID,EntityValue) VALUES(10,'George')
INSERT INTO @tbl(AttributeID,EntityValue) VALUES(10,'Ringo')
INSERT INTO @tbl(AttributeID,EntityValue) VALUES(11,'Lennon')
INSERT INTO @tbl(AttributeID,EntityValue) VALUES(11,'McCartney')
INSERT INTO @tbl(AttributeID,EntityValue) VALUES(11,'Harrison')
SELECT A.AttributeID,AttributeName,EntityValue FROM @tbl T
INNER JOIN @Attribute A
ON T.AttributeID=A.AttributeID


DECLARE @Tbl2 Table(
FirstName Varchar(MAX),
LastName Varchar(MAX)
)
INSERT INTO @Tbl2(FirstName,LastName) VALUES('John','Lennon')
INSERT INTO @Tbl2(FirstName,LastName) VALUES('Paul','McCartney')
INSERT INTO @Tbl2(FirstName,LastName) VALUES('George','Harrison')
INSERT INTO @Tbl2(FirstName) VALUES('Ringo')
SELECT * FROM @Tbl2

2 个答案:

答案 0 :(得分:0)

根据您发布的内容,您正在处理SQL Server。

旧学校方法是使用IF或CASE语句来表示您要创建的每个列。 IE:

CASE WHEN t.AttributeID = 10 THEN t.EntityValue ELSE NULL END 'FirstName'

另一种方法是使用PIVOT(SQL Server 2005 +)。

在任何一种情况下,您都必须手动定义输出列。如果你设置了模型以解决它,你可能可以使用动态SQL。

答案 1 :(得分:0)

如果您感到好奇,Microsoft SQL Server的PIVOT运算符不是“动态”的原因,并且您必须指定要转动的每个值,这样就可以从中识别PIVOT查询的表结构单独的查询文本。这是大多数编程语言的一个重要原则 - 应该可以从表达式中确定表达式的类型。该类型不应该依赖于表达式中提到的任何内容的运行时值。

也就是说,SQL的一些实现实现了你想要的。例如,我认为Microsoft Access使用TRANSFORM进行此操作。

如果您在网上搜索“动态支点”,您会发现很多。