mysql 8 pivot 查询应该返回一个非空值

Posted

技术标签:

【中文标题】mysql 8 pivot 查询应该返回一个非空值【英文标题】:mysql 8 pivot query should return a non null value 【发布时间】:2021-04-05 00:52:30 【问题描述】:

我希望以下数据透视查询显示值 0 而不是 null,

SELECT 
    pi.employeeId,
    pi.Id,
    MAX(CASE
        WHEN pi.category = 'Repayment' THEN pi.value
        WHEN isnull(pi.category) = 1 then 0
        -- ELSE 0
    END) as 'Repayment',
     MAX(CASE
        WHEN pi.category = 'Salary' THEN pi.value
        ELSE 0
    END) as 'Salary',
     MAX(CASE
        WHEN pi.category = 'Allowance' THEN pi.value
        ELSE 0
    END) as 'Allowance'
FROM
   payData pi
GROUP BY pi.employeeId , pi.Id ;

上面的输出是,

employeeId     Id      Repayment    Salary  Allowance
  121          2           2000     15000     1000
  122          2           null     20000     2000

员工 id 122 没有 还款 值,因此所需的输出是,

employeeId     Id      Repayment    Salary  Allowance
    121        2         2000       15000     1000
    122        2           0        20000     2000

dbfiddle

【问题讨论】:

很高兴你能提供一个小提琴。但是这个问题应该是完整的,没有外部参考,外部参考可能会随着时间的推移而消失。请在问题本身中包含CREATEINSERT 语句。那么小提琴是一个不错的奖励。 你为什么把-- ELSE 0注释掉了?我错过了什么吗?如果你取消注释,它会给你你想要的。 (不过你可以删除WHEN isnull(pi.category) = 1 then 0 了解 COALESCE() @stickybit 这是最奇怪的事情,如果我取消注释 - 否则 0 预付款类别不会显示在 mysql 开发人员上。与我知道的工具无关,但我猜测与数据有关。我试图找出那是什么。 【参考方案1】:

我不认为需要第二个还款分支case。如果类别不可用时要0,只需else 0

SELECT 
    employeeId,
    Id,
    MAX(CASE WHEN category = 'Repayment' THEN value ELSE 0 END) as Repayment,
    MAX(CASE WHEN category = 'Salary'    THEN value ELSE 0 END) as Salary,
    MAX(CASE WHEN category = 'Allowance' THEN value ELSE 0 END) as Allowance
FROM payData pi
GROUP BY employeeId, Id;

注意事项:

不要使用单引号作为标识符!它们应仅用于文字字符串,如 ANSI SQL 中所指定并在所有数据库中均受支持。

您有一个单表查询,因此不需要为所有列名添加前缀

【讨论】:

以上是关于mysql 8 pivot 查询应该返回一个非空值的主要内容,如果未能解决你的问题,请参考以下文章

Mysql - 转换非空值第 2 部分

MySQL 按空值和非空值分组

sql 查询时有空值返回0怎么写

列集的平均值减去最后一个非空值? [复制]

如何使用 php 从 mySQL DB 中的两个表中添加非空值?

返回第一个非空值