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  

我想变成:

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

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

4

1 回答 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
于 2011-05-13T21:06:36.277 回答