MySQL 数据透视表

3
在过去的几天里,我一直在试图找到这个问题的答案。虽然我还没有找到答案,但是这个网站在我的搜索结果中一直出现,所以我想试试。顺便说一下,这个网站的文章格式选项很棒。
我有一个类似如下的表格:
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  

that I want to turn into:

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  

当表单ID为2时,报告的样子如下:

user_id | fav_color | fav_animal  
3         red         eagle  
4         blue        dog  

我对高级SQL编程和程序不熟悉,无法自己解决这个问题。我需要查询能够处理任意数量/类型的字段,而无需为每个表单输入精确的可能字段名称。请注意,上面的第一个查询有四个字段,而第二个查询只有三个。因此,解决方案需要具有这种灵活性。 SQL也可以从编程语言生成,因此如果有更多选项,则可以采用该解决方案。如果您需要更多信息,请告知我。
1个回答

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

谢谢您的回复。我简直不敢相信我直到现在才看到这个,但由于我可以通过编程方式创建SQL语句,因此我可以首先查询字段名称的数据,然后为每种类型的表单动态创建您提供的SQL语句。我对上述语句唯一的更改是将“group by form_id”更改为“group by user_id”,以便我获得每个用户的响应而不是该表单的第一个响应。再次感谢您的帮助! - Darren Spafford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接