我有以下查询:
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 answers
Do you like cats? Yes,Yes,No,Yes
Do you like pizza? Yes,Yes,Yes,No
有什么方法可以得到更像这样的东西吗?
question answer1 answer2 answer3 answer4
Do you like cats? Yes Yes No Yes
Do you like pizza? Yes Yes Yes No
答案 0 :(得分:0)
是的,这是可能的,但需要动态SQL;
您可以在此处查看可以扩展到您的问题的相关解决方案:Pivots with Dynamic Columns in SQL Server 2005
在下面部分转载,因为我认为它非常酷:
<小时/> 此查询在SQL Server 2000和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, '') + ']'
此列列表在我们要构建的数据透视查询中使用两次。在我们想要检索的列列表中使用它之后,一旦它被用作应该成为列的值列表。在构建了上面的列列表之后,我们可以将它与枢轴查询的缺失部分连接起来,如:
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;'
使用
执行此操作EXECUTE(@query)
将为我们提供预期的结果:一个透视表并显示在表中指定的列:
tID Country Day Month
----------- ---------- ---------- ----------
1 US 4 July
2 US 11 Sep
3 US 25 Dec