gpt4 book ai didi

mysql 枢轴/交叉表查询

转载 作者:IT老高 更新时间:2023-10-29 00:19:21 24 4
gpt4 key购买 nike

问题 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 |

我知道我需要使用交叉表/数据透视表查询来获取此显示。为此,我根据我对它的有限知识进行了尝试。以下是我的查询:

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_input1user_input2... 作为 header 。相反,我希望将 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

需要帮助。

最佳答案

虽然@John 的静态答案效果很好,但如果您要转换的列数量未知,我会考虑使用准备好的语句来获取结果:

SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'GROUP_CONCAT((CASE node_id when ',
node_id,
' then entered_value else NULL END)) AS user_input',
node_id
)
) INTO @sql
FROM trn_user_log;


SET @sql = CONCAT('SELECT app_id, transaction_id, mobile_no, ', @sql, '
FROM trn_user_log
GROUP BY app_id, transaction_id, mobile_no');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQL Fiddle with Demo

至于你的第二个,请澄清你正在尝试做什么,目前还不清楚。

关于mysql 枢轴/交叉表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12382771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com