2010-05-25 7 views
0

MSSQL에서 PIVOT을 사용하는 모든 예는이를 사용하여 데이터를 집계하는 사람들을 보여줍니다. 나는이 그냥 단순히 때라도 데이터가행을 열로 피벗하는 방법

SELECT 11826 ID,cast('64 ' as varchar(1000)) as answer,75098 QuestionID,2785 CollectionID into #temp 
insert into #temp SELECT 11827 ID,cast('Security ' as varchar(1000)) as answer,75110 QuestionID,2785 CollectionID 
insert into #temp SELECT 11828 ID,cast('42 ' as varchar(1000)) as answer,75115 QuestionID,2785 CollectionID 
insert into #temp SELECT 11829 ID,cast('3/23/2010 12:01:00 AM ' as varchar(1000)) as answer,75119 QuestionID,2785 CollectionID 
insert into #temp SELECT 11830 ID,cast('3/25/2010 ' as varchar(1000)) as answer,75120 QuestionID,2785 CollectionID 
insert into #temp SELECT 11898 ID,cast('67 ' as varchar(1000)) as answer,75313 QuestionID,2792 CollectionID 
insert into #temp SELECT 11899 ID,cast('True ' as varchar(1000)) as answer,75314 QuestionID,2792 CollectionID 
insert into #temp SELECT 11900 ID,cast('0 ' as varchar(1000)) as answer,75315 QuestionID,2792 CollectionID 
insert into #temp SELECT 11901 ID,cast('[email protected] ' as varchar(1000)) as answer,75316 QuestionID,2792 CollectionID 

결과는 내가 실험을했습니다

CollectionID [AnswerFor75098]  [AnswerFor75110]  [AnswerFor75115]  [AnswerFor75315]... 
2785    64     Security   42     
2792    Null    Null     Null     67 

같은 것을 양보해야한다 고려, 열 예를 들어

에 행을 바꾸어 악용하기 위해 노력하고있어 그러나 PIVOT 함께이 올바른 솔루션을 잘 모르겠습니다. 그렇다면 누구나 사용할 수있는 힌트가 있습니까? 아마도이 저장 프로 시저에서 꽤 할 수 있다고 생각하지만, 가능한 경우 커서를 사용하지 않으려 고합니다. 도움 그들이 PIVOT을 할 때 사람들이 종종 인식하지 않는

답변

1

당신이 찾고있는 것은 크로스 탭 쿼리입니다. 당신은 당신이 미리 찾는 질문 번호를 알고 있다면, 당신과 같이 그것을 할 수 있습니다 : 당신이 원하는 것은 동적 질문에 따라 열을 결정하는 경우

Select CollectionId 
    , Min(Case When Question = 75098 Then Answer End) As AnswerFor75098 
    , Min(Case When Question = 75110 Then Answer End) As AnswerFor75110 
    , Min(Case When Question = 75115 Then Answer End) As AnswerFor75115 
    , Min(Case When Question = 75315 Then Answer End) As AnswerFor75315 
From #Temp 
Group By CollectionId 

그러나, 다음, 당신이 원하는 것은 동적 크로스 탭입니다 SQL Server에서 일부 추악한 동적 SQL을 사용하지 않으면이 작업을 수행 할 수 없습니다. 대신 중간 계층이나보고 도구에서이 작업을 수행해야합니다.

+0

내가 간다, 물건을 overcomplicating. 이 접근법을 먼저 시도해 볼 것이고, 그러면 피벗을 망가뜨릴 것입니다. – Beta033

1

한 가지에 대한

덕분에 당신이 당신의 열 및 쿼리에 하드 코드를 알 필요가 있다는 것입니다. 이것은 우리에게 "이것이 가장 좋은 방법일까요?"라고 생각하게합니다.

Microsoft의 PIVOT 구문을 사용하는 경우에도 데이터 값에 따라 동적으로 열을 추가하는 범용 SQL 쿼리를 작성할 수 없습니다.

PIVOTJOIN을 작성하는 것보다 훨씬 편리하므로 PIVOT (Microsoft SQL Server를 독점적으로 사용하는 경우)으로 제안하십시오.

+0

오라클 11g 피벗 및 UNPIVOT 구문을 개정을 제안 주시기 바랍니다. SQL Server 2005에서 PIVOT 대 CASE의 제한된 비교에서 CASE가 약간 더 빨랐습니다. 주로 이식성 문제에 대해 CASE 문을 사용하는 경향이 있습니다. –

+0

이것은 단일 SELECT 쿼리에서 엄격하게 수행 할 수 없지만 동적으로 실행하는 동적 SQL을 빌드하기 위해 하나의 select를 갖는 저장된 proc로 수행 할 수 있습니다. 그것이 일어 났을 때 저는 오늘 아침에 도난당한 아이디어를 사용하여 그렇게했습니다. http://www.sqlprof.com/blogs/sqldev/archive/2008/04/12/pivots-with-dynamic-columns-in-sql-server- 2005-2008.aspx –

0

샘플 데이터와 함께 피벗 (Pivot)을 사용하는 방법을 보여주는 빠른 SQL을 수행했습니다. 나는 그것이 당신이 원하는 것에 집중할 수 있다고 생각합니다.

Select CollectionId,[75098],[75110],[75113],[75114],[75115] from 
(Select QuestionID ,CollectionId, answer From #temp group by QuestionID,CollectionId, answer) as ST 
    PIVOT (count(QuestionID) for QuestionID in ([75098],[75110],[75113],[75114],[75115]))as PT 
group by CollectionId,[75098],[75110],[75113],[75114],[75115] 

@community,이 제안에 +가 지원

관련 문제