开发者社区> 问答> 正文

MySQL数据透视/交叉表查询?mysql

问题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_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 需要帮助。

展开
收起
保持可爱mmm 2020-05-16 22:14:57 552 0
1 条回答
写回答
取消 提交回答
  • 虽然@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;来源:stack overflow

    2020-05-16 22:25:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像