除非找到0条记录,否则我的SQL查询效果很好。有没有办法让“ttlTotal”= 0?目前,当找不到记录时,它返回NULL。
SELECT
UserName,
SUM(ifNull(Day1Reg, 0) +
ifNull(Day2Reg, 0) +
ifNull(Day3Reg, 0) +
ifNull(Day4Reg, 0) +
ifNull(Day5Reg, 0) +
ifNull(Day6Reg, 0) +
ifNull(Day7Reg, 0) +
ifNull(Day1OT, 0) +
ifNull(Day2OT, 0) +
ifNull(Day3OT, 0) +
ifNull(Day4OT, 0) +
ifNull(Day5OT, 0) +
ifNull(Day6OT, 0) +
ifNull(Day7OT, 0)) as ttlTotal
FROM weeks
WHERE RecNum = 1
AND
(Day1Reg IS NOT NULL OR
Day1OT IS NOT NULL OR
Day2Reg IS NOT NULL OR
Day2OT IS NOT NULL OR
Day3Reg IS NOT NULL OR
Day3OT IS NOT NULL OR
Day4Reg IS NOT NULL OR
Day4OT IS NOT NULL OR
Day5Reg IS NOT NULL OR
Day5OT IS NOT NULL OR
Day6Reg IS NOT NULL OR
Day6OT IS NOT NULL OR
Day7Reg IS NOT NULL OR
Day7OT IS NOT NULL)
GROUP BY UserName
答案 0 :(得分:3)
您可以将整个sum()
打包在isnull()
或coalesce()
(具有同等功能的ANSI标准)中:
SELECT
UserName,
COALESCE(SUM(ifNull(Day1Reg, 0) +
ifNull(Day2Reg, 0) +
ifNull(Day3Reg, 0) +
ifNull(Day4Reg, 0) +
ifNull(Day5Reg, 0) +
ifNull(Day6Reg, 0) +
ifNull(Day7Reg, 0) +
ifNull(Day1OT, 0) +
ifNull(Day2OT, 0) +
ifNull(Day3OT, 0) +
ifNull(Day4OT, 0) +
ifNull(Day5OT, 0) +
ifNull(Day6OT, 0) +
ifNull(Day7OT, 0)), 0) as ttlTotal
尽管如此。您的数据结构是非规范化的。对于规范化的数据结构,这种查询通常会更容易。也就是说,不是将信息存储在不同列中的七天,而是将信息存储在不同的行中。
答案 1 :(得分:0)
如果这些列为NOT NULL
并且如果它们没有值则强制它们为零,那么它将如此更容易。
NULL
值适用于"不可用"或"不适用",这两者都与您没有工作或没有加班的日子有关。
然后你的查询就会简单得多:
select UserName, sum(Day1Reg + Day2Reg + ... + Day7OT) as ttlTotal
from weeks
where RecNum = 1
group by UserName