作为结果集的字段 headers in mysql 8

Fields as result set headers in mysql 8

下面是我的数据片段,

empid   CategoryName               Type    value
1      Accommodation Deduction   DEDUCTION  -100.0000
1      Canteen Deduction         DEDUCTION  -200.0000
1      Housing                   ADDITION   3000.0000
1      Transport Allowance       ADDITION   2000.0000

empid 将是员工 ID,数据集中还有其他员工 ID,但所有员工都有相似的数据。

我的目标是将各种薪酬类别显示为查询结果中的列,例如,

Accommodation Deduction   Canteen Deduction   Housing          Transport Allowance
   -100.0000                 -200.0000        3000.0000          2000.0000

我正在使用以下查询,

select 
     MAX(CASE
        WHEN CategoryName = 'Accommodation Deduction' THEN pi.value
        ELSE 0
    END) AS 'Accommodation Deduction',
     MAX(CASE
        WHEN CategoryName = 'Canteen Deduction' THEN pi.value
        ELSE 0
    END) AS 'Canteen Deduction',
     MAX(CASE
        WHEN CategoryName = 'Housing' THEN pi.value
        ELSE 0
    END) AS 'Housing',
     MAX(CASE
        WHEN CategoryName = 'Transport Allowance' THEN pi.value
        ELSE 0
    END) AS 'Transport Allowance' from Report pi group by empid;

扣除类别显示的值为零,这不应该,

Accommodation Deduction   Canteen Deduction     Housing         Transport Allowance
       0.0000               0.0000              3000.0000          2000.0000

dbfiddle

因为CASE语句的ELSE 0分支,所以条件MAX()returns0有负值的列。

您可以将这些变成 MIN()s:

select empid
     MIN(CASE WHEN CategoryName = 'Accommodation Deduction' THEN pi.value ELSE 0 END) AS Accommodation_Deduction,
     MIN(CASE WHEN CategoryName = 'Canteen Deduction'       THEN pi.value ELSE 0 END) AS Canteen_Deduction,
     MAX(CASE WHEN CategoryName = 'Housing'                 THEN pi.value ELSE 0 END) AS Housing,
     MAX(CASE WHEN CategoryName = 'Transport Allowance'     THEN pi.value ELSE 0 END) AS Transport_Allowance 
from Report pi 
group by empid;