ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL数据透视表

2019-12-08 12:17:39  阅读:601  来源: 互联网

标签:crosstab pivot-table sql 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有