首页 > 解决方案 > 如何在 MySQL 中创建列而不是连接字符串?

问题描述

我有一个查询:

SELECT 
    t.emp_number, 
    t.date_created, 
    GROUP_CONCAT(t.time_stamp) as punch
FROM attendance_copy t
WHERE t.attendance_status like "%Punch%"

GROUP BY t.date_created
order by date_created,time_stamp

结果集:

   id          date            punch
IPPH0004  | 2021-10-01 |  01:00:00,09:26:03
IPPH0004  | 2021-10-02 |  08:00:00,11:00:00

而不是逗号分隔的单元格,我希望它作为一个列或单元格,如下所示:

   id         date         in         out
IPPH0004 | 2021-10-01 | 01:00:00  | 09:26:03
IPPH0004 | 2021-10-02 | 08:00:00  | 11:00:00

这可能吗?谢谢。

标签: mysql

解决方案


如果您希望根据在每个组中找到多少行来增加列数,那么不,这是不可能的。SQL 的一个不可改变的特性是,您必须在查询开始执行之前指定选择列表中的列数,因此在它读取任何数据之前。所以列的列表是固定的,并且在读取行时不会动态扩展。

您可以在选择列表中创建多个表达式,与您希望在组中找到的一样多:

SELECT t.emp_number, t.date_created,
  MAX(CASE rownum WHEN 1 THEN time_stamp END) AS in,
  MAX(CASE rownum WHEN 2 THEN time_stamp END) AS out
FROM (
    SELECT emp_number, date_created, time_stamp,
      ROW_NUMBER() OVER (PARTITION BY date_created ORDER BY time_stamp) AS rownum
    FROM attendance_copy) AS t
GROUP BY emp_number, date_created;

推荐阅读