MySql选择动态行值作为列名
这是我给定的表格:MySql选择动态行值作为列名,mysql,sql,pivot-table,Mysql,Sql,Pivot Table,这是我给定的表格: +---------+------------+-------------------+--------------------------+---------------+---------------+ | exec_id | project_id | flow_id | job_id | start_time | end_time | +---------+------------+--------
+---------+------------+-------------------+--------------------------+---------------+---------------+
| 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
我花了两天多的时间在这方面,但收效甚微。帮助了我,但还不完全。如您所见,另一个问题涉及获取2列并将其转换为2行。但是我必须取3列并将它们转换成2行
有人能帮我吗?甚至在MySQL中也有可能吗
编辑1
谢谢Khalid Junaid的回答,它解决了我的问题。我必须再做一次修改。我必须按开始时间按升序排列所选列
例如:
当前查询将返回:
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
请注意,现在根据开始时间更改了列的顺序
我尝试使用
临时表
和视图
来实现这一点,我认为这将非常简单。很遗憾,我没有创建表/创建视图的权限。在没有临时表和视图的情况下,有没有办法做到这一点?是的,在MySQL中是可以做到的,但在任何SQL数据库中,都无法进行查询,从而根据它找到的数据值动态创建列。在准备查询时,查询的列必须固定。因此,您必须事先知道要成为列的不同值。这可能需要另一个查询。这适用于所有SQL数据库,而不仅仅是MySQL
SELECT exec_id,
MIN(CASE job_id WHEN 'init' start_time END) AS init_start,
MIN(CASE job_id WHEN 'init' end_time END) AS init_end,
MIN(CASE job_id WHEN 'job_id_1' start_time END) AS job_id_1_start,
MIN(CASE job_id WHEN 'job_id_1' end_time END) AS job_id_1_end
FROM `this_is_my_given_table`
GROUP BY exec_id
这基本上是对每个不同的作业id进行硬编码,但这是必要的。根据参考问题的方法使用
group\u concat
,您可以这样做,但请注意,随着每个exec\u id
组的作业id增加,那么group\u concat
方法将不会是最佳的,因为它的默认长度为1024个字符,要连接,对于动态列,这肯定会超过该限制,但该限制可以如中所述增加
job_id是否限制为3个,或者b可以超过3个?为什么希望每个记录有单独的表?相反,为什么不能用通用字段(job_id、init_start、init_end、job_id_start、…)创建一个新表?@MKhalidJunaid:job_id可以超过3@vengets:我没有创建新表。我必须查询此表并将结果附加到文件是否要使用过程/函数?我已解决了上述问题。这是小提琴:。但是我必须在模式中做一个小的更改,
execution\u jobs
和execution\u flows
有几个同名的列(start\u time
和end\u time
),我不能更改。我正在尝试这个,但它不起作用。你能帮我吗?Thanks@Bhushan从你上面的评论来看,还不清楚你能不能提出一个新的问题,包括所有细节,如果你想让我看看这个新问题,那么请提供链接给我,我已经添加了另一个子问题。你能看一下吗?谢谢。@Bhushan您能就上述问题提出新问题,并提供有关该问题的所有信息吗?这些信息对我和新访客都有好处。请在此处为我提供新问题的链接。这里是新问题:
SELECT exec_id,
MIN(CASE job_id WHEN 'init' start_time END) AS init_start,
MIN(CASE job_id WHEN 'init' end_time END) AS init_end,
MIN(CASE job_id WHEN 'job_id_1' start_time END) AS job_id_1_start,
MIN(CASE job_id WHEN 'job_id_1' end_time END) AS job_id_1_end
FROM `this_is_my_given_table`
GROUP BY exec_id
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;