mysql 用行实现动态列,MySql选择动态行值作为列名

这是我给出的表格:

+---------+------------+-------------------+--------------------------+---------------+---------------+

| exec_id | project_id | flow_id | job_id | start_time | end_time |

+---------+------------+-------------------+--------------------------+---------------+---------------+

| 10919 | 16 | my_flow_cleanup | init | 1408480308611 | 1408480308686 |

| 10919 | 16 | my_flow_cleanup | job_id_1 | 1408480309212 | 1408480309426 |

| 10919 | 16 | my_flow_cleanup | job_id_2 | 1408480308721 | 1408480308776 |

| 10919 | 16 | my_flow_cleanup | job_id_3 | 1408480308827 | 1408480309171 |

+---------+------------+-------------------+--------------------------+---------------+---------------+

我想要实现这样的选择:

exec_id init_start init_end job_id_1_start job_id_1_end job_id_2_start job_id_2_end job_id_3_start job_id_3_end

10919 1408480308611 1408480308686 1408480309212 1408480309426 1408480308721 1408480308776 1408480308827 1408480309171

我花了两天多的时间,但收效甚微. This question对我有所帮助,但并非如此.如您所见,另一个问题涉及获取2列并将其转换为2行.但我必须采取3列并将它们转换为2行.

谁能帮我这个?它甚至可以在MySQL中使用吗?

编辑1

谢谢Khalid Junaid的答案,它解决了我的问题.我还要做一个修改.我必须通过start_time按升序对所选列进行排序.

例如.:

+---------+------------+-------------------+----------+---------------+---------------+

| exec_id | project_id | flow_id | job_id | start_time | end_time |

+---------+------------+-------------------+----------+---------------+---------------+

| 10919 | 16 | my_flow_cleanup | init | 10 | 15 |

| 10919 | 16 | my_flow_cleanup | job_id_1 | 30 | 40 |

| 10919 | 16 | my_flow_cleanup | job_id_2 | 40 | 50 |

| 10919 | 16 | my_flow_cleanup | job_id_3 | 20 | 25 |

+---------+------------+-------------------+----------+---------------+---------------+

当前查询将返回:

exec_id init_start init_end job_id_1_start job_id_1_end job_id_2_start job_id_2_end job_id_3_start job_id_3_end

10919 10 15 30 40 40 50 20 25

我需要:

exec_id init_start init_end job_id_3_start job_id_3_end job_id_1_start job_id_1_end job_id_2_start job_id_2_end

10919 10 15 20 25 30 40 40 50

请注意,根据start_time,列的顺序现在已更改.

我尝试用临时表和视图来做这个,我觉得这很容易.不幸的是,我没有创建表/创建视图权限.有没有办法在没有临时表和视图的情况下实现这一目标?

解决方法:

从参考问题的使用group_concat的方法来看,你可以这样做,但是注意一件事,因为每个exec_id组你的工作id增加,然后group_concat方法不会是最佳的,因为它的默认长度为1024个字符要连接,对于动态列,这肯定会越过这个限制,但这个限制可以增加,如documentation所述

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT

CONCAT('MAX(CASE WHEN job_id = ''',

job_id,

''' THEN start_time END) `',

job_id,

'_start`',

',',

'MAX(CASE WHEN job_id = ''',

job_id,

''' THEN end_time END) `',

job_id,

'_end`'

)

)

INTO @sql

FROM t;

SET @sql = CONCAT('SELECT exec_id, ', @sql, '

FROM t

GROUP BY exec_id');

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

标签:sql,mysql,pivot-table

来源: https://codeday.me/bug/20191003/1847833.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值