【问题标题】:MySQL Pivot TableMySQL 数据透视表
【发布时间】:2011-05-13 20:59:00
【问题描述】:

在过去的几天里,我一直在试图找到这个问题的答案。虽然我还没有找到答案,但这个网站一直出现在我的搜索结果中,所以我想我会试一试。顺便说一句,帖子的格式选项很棒。

我有一张这样的桌子:

user_id | form_id | question_id | data_label | data_value  
1         1         1             firstName    Joe  
1         1         2             lastName     Smith  
1         1         3             phone        5554443333  
2         1         1             firstName    Sally  
2         1         2             lastName     Jones  
2         1         3             phone        3334445555  

我想变成的:

user_id | firstName | lastName | phone  
1         Joe         Smith      5554443333  
2         Sally       Jones      3334445555  

我可以找到如何执行此操作的示例。我不太了解它们,但它们就在那里。当这个单一的表包含从具有任何可能数量的字段的各种表单输入的数据时,我的独特问题就会生效。所以,我可能有一张桌子:

user_id | form_id | question_id | data_label | data_value  
1         1         1             firstName    Joe  
1         1         2             lastName     Smith  
1         1         3             phone        5554443333  
2         1         1             firstName    Sally  
2         1         2             lastName     Jones  
2         1         3             phone        3334445555  
3         2         1             fav_color    red  
3         2         2             fav_animal   eagle  
4         2         1             fav_color    blue  
4         2         2             fav_animal   dog  

然后,我将 form_id 作为参数传入,从该表单中收集按用户分组的所有记录(它们都应该具有不同值的相同标签),然后将该数据显示为:

...当 form_id = 1 时,报告如下所示:

user_id | firstName | lastName | phone  
1         Joe         Smith      5554443333  
2         Sally       Jones      3334445555  

...当 form_id = 2 时,报告如下所示:

user_id | fav_color | fav_animal  
3         red         eagle  
4         blue        dog  

我是高级 SQL 编程和程序的新手,我无法自己弄清楚如何做到这一点。我需要查询能够处理任何数量/类型的字段,而不必在每个表单的查询中输入确切的可能字段名称。请注意,上面的第一个查询有四个字段,而第二个有 3 个字段。因此解决方案需要以这种方式灵活。

SQL 也可以从编程语言生成,因此如果有帮助,该解决方案还有更多选项。

如果您没有足够的信息,请告诉我。

【问题讨论】:

    标签: mysql sql pivot-table crosstab


    【解决方案1】:

    您可以尝试(未经测试)类似

    select form_id, 
    max(case data_label when 'lastName' then data_value else null end) as lastname, 
    max(case data_label when 'firstName' then data_value else null end) as firstname,
    max(case data_label when 'phone' then data_value else null end) as phone
    from mytable 
    group by form_id
    

    【讨论】:

    • 感谢您的回复。我不敢相信直到现在我还没有看到这一点,但是由于我可以以编程方式创建 SQL 语句,我可以首先查询数据以获取字段名称,然后动态创建您为每种类型的表单提供的 SQL 语句。我对上述语句所做的唯一更改是将“按 form_id 分组”更改为“按 user_id 分组”,因此我得到了每个用户的响应与该表单的第一个响应。再次感谢您的帮助!
    猜你喜欢
    • 2023-04-08
    • 2020-08-28
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多