问题1: 我有一个如下所示的结构和数据的表:
app_id transaction_id mobile_no node_id customer_attribute entered_value
100 111 9999999999 1 Q1 2
100 111 9999999999 2 Q2 1
100 111 9999999999 3 Q3 4
100 111 9999999999 4 Q4 3
100 111 9999999999 5 Q5 2
100 222 8888888888 4 Q4 1
100 222 8888888888 3 Q3 2
100 222 8888888888 2 Q2 1
100 222 8888888888 1 Q1 3
100 222 8888888888 5 Q5 4
我想以以下格式显示这些记录:
app_id | transaction_id | mobile | Q1 | Q2 | Q3 | Q4 | Q5 |
100 | 111 | 9999999999 | 2 | 1 | 4 | 3 | 2 |
100 | 222 | 8888888888 | 3 | 1 | 2 | 1 | 4 |
我知道我需要使用crosstab / pivot查询来获得此显示。为此,我根据自己有限的知识尝试了它。以下是我的查询:
SELECT app_id, transaction_id, mobile_no,
(CASE node_id WHEN 1 THEN entered_value ELSE '' END) AS user_input1,
(CASE node_id WHEN 2 THEN entered_value ELSE '' END) AS user_input2,
(CASE node_id WHEN 3 THEN entered_value ELSE '' END) AS user_input3,
(CASE node_id WHEN 4 THEN entered_value ELSE '' END) AS user_input4,
(CASE node_id WHEN 5 THEN entered_value ELSE '' END) AS user_input5
FROM trn_user_log
GROUP BY app_id, transaction_id, mobile_no, node_id
根据这个查询,我得到了如下显示:
app_id transaction_id mobile_no user_input1 user_input2 user_input3 user_input4 user_input5
100 111 9999999999 2
100 111 9999999999 1
100 111 9999999999 4
100 111 9999999999 3
100 111 9999999999 2
100 222 8888888888 3
100 222 8888888888 1
100 222 8888888888 2
100 222 8888888888 1
100 222 8888888888 4
请问有人能帮我更改查询语句以便将记录放在一行中而不是多行吗?
问题2:同时,有没有一种方法可以将特定字段的值作为列名。如上所示,我的表头为user_input1
、user_input2
等。我想要的是将customer_attribute
的值作为列头。
为此,我查看了以下内容:NAME_CONST(name,value)
:
SELECT app_id, transaction_id, mobile_no,
NAME_CONST(customer_attribute, (CASE node_id WHEN 1 THEN entered_value ELSE '' END))
FROM trn_user_log
但是它会出现错误
Error Code : 1210 Incorrect arguments to NAME_CONST
需要帮助。
customer_attr
,来代替user_input
作为表头显示。所以例如,Q1
应该显示在user_input1
的位置。我知道我可以在Java代码中处理这个问题,通过单独获取表头列并相应地显示它。但我只是想知道是否可能实现这样的事情。无论如何,感谢您的帮助。 - DarkKnightFan