2009-08-07 8 views
1

엔티티 - 특성 테이블을 피벗하는 방법이 있습니까? 얼마나 많은 속성이 있는지에 관계없이 모든 행을 열로 바꾸고 싶습니다.SQL 피벗 테이블

다음은 내가 성취하고자하는 목표의 예입니다. 이 예에서는 이름, 성 등 두 가지 속성을 사용합니다. 그러나 실제 데이터베이스에는 수천 개의 속성이 있으며보고 목적으로 열로 넘겨 씁니다.

모든 속성에 대해 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' 

대안은 (2005 + SQL 서버) PIVOT를 사용하는 것입니다.

두 경우 모두 수동으로 출력 열을 정의해야합니다. 모델을 설정하여 동적 SQL을 사용할 수 있습니다.

+0

어떻게하면됩니까? –

+1

CASE가 제공된 예제와 더 일치하도록 업데이트되었지만 IF/CASE 또는 PIVOT이 행을 열로 변환하는 유일한 방법입니다. –

0

궁금한 경우 Microsoft SQL Server의 PIVOT 연산자가 "동적"이 아니며 피벗 할 각 값을 지정해야하는 이유 때문에 PIVOT 쿼리의 테이블 구조를 식별 할 수 있습니다 검색어 텍스트만으로 이것이 대부분의 프로그래밍 언어의 중요한 원칙입니다. 식에서 표현식의 유형을 결정할 수 있어야합니다. 형식은 식에 언급 된 런타임 값에 의존해서는 안됩니다.

즉, SQL의 일부 구현은 사용자가 원하는 것을 구현합니다. 예를 들어, Microsoft Access에서는 TRANSFORM으로이 작업을 수행합니다.

웹에서 "동적 피벗"을 검색하면 많이 찾을 수 있습니다.