【问题标题】:Can I turn this into a pivot table?我可以把它变成一个数据透视表吗?
【发布时间】:2010-12-03 19:07:14
【问题描述】:

我有以下疑问:

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

【问题讨论】:

  • 可能没有。有固定数量的答案吗?
  • 你访问mysql的框架等是什么?但是,我不明白输出原始调查数据(未汇总)的目的。你们只有 4 名参与者吗?
  • 可能没有......除非使用子查询打破每个答案
  • 不,没有固定数量的答案。我正在使用 symfony (PHP),但我希望在 SQL 中实现这一点。如果我想用 PHP 来做,我已经知道怎么做,但是很痛苦。

标签: mysql pivot-table sql


【解决方案1】:

是的,可以,但是需要动态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

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 2017-03-03
    • 2020-04-24
    • 1970-01-01
    • 2014-03-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多