MySQL数据透视表

时间:2011-05-13 20:59:01

标签: mysql sql pivot-table crosstab

过去几天,我一直试图找到这个问题的答案。虽然我没有找到答案,但这个网站仍然出现在我的搜索结果中,所以我想我会尝试一下。 BTW帖子的真棒格式化选项。

我有一张表:

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也可以从编程语言生成,因此如果有帮助,该解决方案还有更多选项。

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

1 个答案:

答案 0 :(得分:3)

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

的内容
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