数据库
首页 > 数据库> > MySQL数据透视表

MySQL数据透视表

作者:互联网

在过去的几天中,我一直在寻找解决此问题的方法.虽然我没有找到答案,但该网站一直出现在我的搜索结果中,因此我想尝试一下.顺便说一句,真棒.

我有一张像这样的桌子:

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,因此如果有帮助,该解决方案还有更多选择.

如果您没有足够的信息,请通知我.

解决方法:

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

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

标签:crosstab,pivot-table,sql,mysql
来源: https://codeday.me/bug/20191208/2091258.html