【问题标题】:mysql 8 pivot query should return a non null valuemysql 8 pivot 查询应该返回一个非空值
【发布时间】: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 开发人员上。与我知道的工具无关,但我猜测与数据有关。我试图找出那是什么。

标签: mysql sql pivot aggregate-functions mysql-8.0


【解决方案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 中所指定并在所有数据库中均受支持。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多