Сводная таблица SQL - PullRequest
       3

Сводная таблица SQL

1 голос
/ 07 августа 2009

Есть ли способ повернуть таблицу Entity-Attribute? Я хочу перевернуть все строки в столбцы, независимо от количества различных атрибутов.

Вот пример того, чего я хочу достичь. В примере используются два атрибута: 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 голосов
/ 08 августа 2009

Если вам интересно, причина того, что оператор PIVOT в Microsoft SQL Server не является «динамическим», и что вы должны указать каждое значение для сводки, заключается в том, что это позволяет определить структуру таблицы запроса PIVOT из только текст запроса. Это важный принцип большинства языков программирования - должно быть возможно определить тип выражения из выражения. Тип не должен зависеть от значений времени выполнения чего-либо, указанного в выражении.

Тем не менее, некоторые реализации SQL реализуют то, что вы хотите. Например, я думаю, что Microsoft Access делает это с помощью TRANSFORM.

Если вы ищете в Интернете «динамический поворот», вы найдете много.

0 голосов
/ 07 августа 2009

Исходя из того, что вы опубликовали, вы имеете дело с SQL Server.

Старый метод заключается в использовании операторов IF или CASE для представления каждого столбца, который вы хотите создать. IE:

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

Альтернативой является использование PIVOT (SQL Server 2005 +).

В любом случае вам придется определять выходные столбцы вручную. Если ваша модель была настроена для ее решения, вы можете использовать динамический SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...