피벗을 사용하여 우리는 결과를 얻을 열 정적없는 동적 SQL을 사용하여
;With cte(Title, Question,Answer,AnswerRemark)
AS
(
SELECT 'ACCCode1','Q1','Y',NULL UNION ALL
SELECT 'ACCCode1','Q2','N','6' UNION ALL
SELECT 'ACCCode1','Q3','Y','Workout' UNION ALL
SELECT 'ACCCode1','Q2','N','7' UNION ALL
SELECT 'ACCCode1','Q1','Y',NULL UNION ALL
SELECT 'ACCCode1','Q3','N','9' UNION ALL
SELECT 'ACCCode1','Q1','N','4' UNION ALL
SELECT 'ACCCode1','Q2','N','Workout' UNION ALL
SELECT 'ACCCode1','Q4','N','2' UNION ALL
SELECT 'ACCCode1','Q3','Y','Workout' UNION ALL
SELECT 'ACCCode1','Q1','N','1' UNION ALL
SELECT 'ACCCode1','Q4','Y',NULL
)
SELECT *,'Remark'+CAST(ROW_NUMBER()OVER(ORDER BY (SELECT 1))AS varchar(10)) AS Question2
, ROW_NUMBER()OVER(PArtition by Question Order by Question) AS Seq
INTO #t FROM cte
DECLARE @DyColumn1 Nvarchar(max),
@DyColumn2 Nvarchar(max),
@Sql Nvarchar(max),
@MAxDyColumn1 Nvarchar(max),
@MAxDyColumn2 Nvarchar(max),
@CombineColumn Nvarchar(max)
SELECT @DyColumn1=STUFF((SELECT DISTINCT ', '+QUOTENAME(Question) FROM #t FOR XML PATH ('')),1,1,'')
SELECT @DyColumn2=STUFF((SELECT ', '+QUOTENAME(Question2) FROM #t FOR XML PATH ('')),1,1,'')
SELECT @MAxDyColumn1=STUFF((SELECT DISTINCT ', '+'MAX('+QUOTENAME(Question)+') AS '+QUOTENAME(Question) FROM #t FOR XML PATH ('')),1,1,'')
SELECT @MAxDyColumn2=STUFF((SELECT ', '+'MAX('+QUOTENAME(Question2)+') AS '+QUOTENAME(Question2) FROM #t FOR XML PATH ('')),1,1,'')
SELECT @CombineColumn=STUFF((SELECT DISTINCT ', '+QUOTENAME(Question)+','+QUOTENAME(Question2) FROM #t FOR XML PATH ('')),1,1,'')
SET @Sql='SELECT Title,'[email protected]+' From
(
SELECT Title,'[email protected]+','[email protected]+' FRom
(
SELECT * FROM #t
)AS SRC
PIVOT
(
MAX(Answer) FOR Question IN('[email protected]+')
) AS Pvt1
PIVOT
(
MAX(AnswerRemark) FOR Question2 IN('[email protected]+')
) AS Pvt2
GROUP BY Title
)dt
'
PRINT @Sql
EXEC(@Sql)
결과
Title Q1 Remark1 Q1 Remark2 Q1 Remark3 Q1 Remark4 Q2 Remark5 Q2 Remark6 Q2 Remark7 Q3 Remark8 Q3 Remark9 Q3 Remark10 Q4 Remark11 Q4 Remark12
ACCCode1 Y NULL Y 1 Y 4 Y NULL N 6 N Workout N 7 Y Workout Y Workout Y 9 Y NULL Y 2
많은 질문이있을 수 있습니까? 겨우 3? – Larnu
답장을 보내 주셔서 감사합니다. 아니요, 많은 질문입니다. 사용자 요청에 따라 달라집니다. –
무제한의 질문 및 답변을 받으실 수 있다면, 빨리 못 생길 것입니다. 이를 위해 동적 SQL을 사용해야 할 것입니다. 나중에이 작업을 수행 할 수있는 기회가 있는지 알 수 있지만 대부분의 솔루션이 성능이 좋지 않을 수 있습니다. 이러한 상황은 일반적으로 프레젠테이션 레이어에서 더 잘 수행됩니다. – Larnu