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
【问题讨论】:
很高兴你能提供一个小提琴。但是这个问题应该是完整的,没有外部参考,外部参考可能会随着时间的推移而消失。请在问题本身中包含CREATE
和INSERT
语句。那么小提琴是一个不错的奖励。
你为什么把-- 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 查询应该返回一个非空值的主要内容,如果未能解决你的问题,请参考以下文章