2009-08-07 6 views
1

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

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

ответ

0

Основываясь на том, что вы опубликовали, вы имеете дело с SQL Server.

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

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

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

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

+0

Как мне это сделать? –

+1

Обновлен CASE, чтобы быть более синхронизированным с примером, который вы предоставили, но IF/CASE или PIVOT являются единственным средством для перевода строк в столбцы. –

0

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

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

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