我可以把它变成一个数据透视表吗?

时间:2010-12-03 19:07:15

标签: mysql pivot-table sql

我有以下查询:

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

1 个答案:

答案 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