Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql选择动态行值作为列名_Mysql_Sql_Pivot Table - Fatal编程技术网

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;