【问题标题】:Select dynamic row values as column names, in specific order按特定顺序选择动态行值作为列名
【发布时间】:2014-09-05 16:45:11
【问题描述】:

继续我的previous question:我必须使用动态行值作为列,但列的顺序需要具体。如果你看下面的例子,我必须按 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            |
+---------+------------+-------------------+----------+---------------+---------------+

上一个问题:

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;

以上查询将返回以下结果:

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 更改了列的顺序。

我尝试用temporary tablesviews 来做这件事,我认为这很容易。不幸的是,我没有创建表/创建视图权限。有没有办法在没有临时表和视图的情况下实现这一点?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以通过在 GROUP_CONCAT 函数中添加 ORDER BY start_time ASC 来做到这一点

    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`' 
             )
              ORDER BY start_time ASC        
     )
      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;
    

    Fiddle Demo

    【讨论】:

      猜你喜欢
      • 2014-10-14
      • 2013-04-05
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      相关资源
      最近更新 更多