I try to do something like a pivot in MySQL but I am stuck.
I got a table which looks like this:
I startetd with the following query:
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
The result of this query looks like this:
So I managed it to place every subSysName as column.
The next step should be, that every entry with the same UUID is also in the same row, like this:
How can I do that? I thought I could do this with a join (JOIN subsys_stat b ON ap.uuid = b.uuid) but this doesn't work.
You need to add grouping to your query:
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
Also, CASE
expressions should be used inside an aggregate function like MAX
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.