MySQL 将具有相同 ID 的行分组为一行

MySQL group rows with same ID in one row

我尝试在 MySQL 中做一些类似枢轴的事情,但我被卡住了。

我得到了一个 table,看起来像这样:

我从以下查询开始:

    SELECT distinct
  p.id, p.uuid, p.kpiDate, p.kpiTime,
  CASE 
     WHEN p.subSysName = 'CMONE' THEN p.status 
     ELSE '' 
  END AS CMONE,
  CASE 
     WHEN p.subSysName = 'DISODAY' THEN p.status 
     ELSE '' 
  END AS DISODAY,
  CASE 
     WHEN p.subSysName = 'DIIN_HFFF' THEN p.status 
     ELSE '' 
  END AS DIIN_HFFF,
  CASE 
     WHEN p.subSysName = 'DIIN_PAL' THEN p.status 
     ELSE '' 
  END AS DIIN_PAL,
  CASE 
     WHEN p.subSysName = 'DISO_FAL' THEN p.status 
     ELSE '' 
  END AS DISO_FAL,
  CASE 
     WHEN p.subSysName = 'MBATCH' THEN p.status 
     ELSE '' 
  END AS MBATCH,
  CASE 
     WHEN p.subSysName = 'MO_BATCH' THEN p.status 
     ELSE '' 
  END AS MO_BATCH,
  CASE 
     WHEN p.subSysName = 'QINTER' THEN p.status 
     ELSE '' 
  END AS QINTER,
  CASE 
     WHEN p.subSysName = 'ZFIREWALL' THEN p.status 
     ELSE '' 
  END AS ZFIREWALL

FROM subsys_stat p
order by p.kpiDate, p.kpiTime

此查询的结果如下所示:

所以我设法将每个 subSysName 作为列。

下一步应该是,具有相同 UUID 的每个条目也在同一行中,如下所示:

我该怎么做? 我以为我可以通过连接 (JOIN subsys_stat b ON ap.uuid = b.uuid) 来做到这一点,但这不起作用。

您需要在查询中添加分组:

 SELECT MIN(p.id), p.uuid, p.kpiDate, p.kpiTime,
        MAX(CASE WHEN p.subSysName = 'CMONE' THEN p.status END) AS CMONE,
        MAX(CASE WHEN p.subSysName = 'DISODAY' THEN p.status END) AS DISODAY,
  ... etc
FROM subsys_stat p
GROUP BY p.uuid, p.kpiDate, p.kpiTime
ORDER BY p.kpiDate, p.kpiTime

此外,CASE 表达式应该在聚合函数内部使用,例如 MAX