2010-12-03 2 views
1

나는 다음과 같은 쿼리가 있습니다이것을 피봇 테이블로 바꿀 수 있습니까?

question    answers 
Do you like cats? Yes,Yes,No,Yes 
Do you like pizza? Yes,Yes,Yes,No 

좀 더 이런 식으로 뭔가를 얻을 수있는 방법이 있나요 :

select q.description question, 
group_concat(a.description) answers 
from answer a 
join question q on a.question_id = q.id 
where survey_id = 6 
group by q.id 

그것은 나에게 이런 식으로 뭔가를 보이는 결과를 제공?

question    answer1 answer2 answer3 answer4 
Do you like cats? Yes  Yes  No  Yes 
Do you like pizza? Yes  Yes  Yes  No 
+0

아마도 아니요. 고정 된 금액의 답변이 있습니까? –

+0

mysql에 액세스하는 프레임 워크 등은 무엇입니까? 그러나 원시 조사 데이터 (집계되지 않음)를 출력하는 목적을 이해하지 못합니다. 4 명의 참가자 만 있습니까? – Flinsch

+0

아마도 아니요 ... 하위 쿼리 – ajreal

답변

0

예, 가능하지만 동적 SQL이 필요합니다.


이 쿼리는 SQL Server 2000 및 2005에 모두 작동 : 나는 그것이 아주 멋진 생각 때문에 Pivots with Dynamic Columns in SQL Server 2005

이, 아래 부분에 재현 :

당신은 사용자의 문제로 확장 할 수있는 관련 솔루션을 볼 수 있습니다 그것은 효율적이지만 할당의 양면에서 같은 변수 (@cols)를 사용하기 때문에 일부는 그것을 좋아하지 않을 수도 있습니다. SQL Server 2005에서만 작동하는 또 다른 솔루션은 XML PATH를 사용하는 것입니다.

DECLARE @cols NVARCHAR(2000) 
SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + t2.ColName 
         FROM Table1 AS t2 
         ORDER BY '],[' + t2.ColName 
         FOR XML PATH('') 
        ), 1, 2, '') + ']' 

이 열 목록은 우리가 목표로하는 피벗 쿼리에서 두 번 사용됩니다. 일단 우리가 검색하고자하는 열 목록에서 사용되면, 일단 열이되어야하는 값 목록으로 사용됩니다. 우리에게 예상 된 결과를 줄 것이다

EXECUTE(@query) 

DECLARE @query NVARCHAR(4000) 
SET @query = N'SELECT tID, '+ 
@cols +' 
FROM 
(SELECT t2.tID 
     , t1.ColName 
     , t2.Txt 
FROM Table1 AS t1 
     JOIN Table2 AS t2 ON t1.ColId = t2.ColID) p 
PIVOT 
(
MAX([Txt]) 
FOR ColName IN 
('+ 
@cols +') 
) AS pvt 
ORDER BY tID;' 

이 실행 : 위의 열이 목록을 구축하는 데, 우리는 단지 같은 피벗 쿼리의 누락 된 부품을 연결할 수있는 테이블을 그 테이블에 지정된 열을 표시합니다.

tID   Country Day  Month 
----------- ---------- ---------- ---------- 
1   US   4   July 
2   US   11   Sep 
3   US   25   Dec