计算字段中的默认值

Default value in calculated field

我有一个非常有效的 SQL 查询,除非找到 0 条记录。有没有办法让"ttlTotal" = 0?目前它 returns 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

所以 如果这些列是 NOT NULL 并且如果它们没有值你强制它们为零,那会容易得多。

NULL 值适用于 "not available" 或 "not applicable",这两者都与您没有工作时间或没有加班的那一天无关。

那么你的查询就简单多了:

select UserName, sum(Day1Reg + Day2Reg + ... + Day7OT) as ttlTotal
from weeks
where RecNum = 1
group by UserName

您可以将整个 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

不过请注意。您的数据结构是非规范化的。使用规范化的数据结构,这样的查询通常会容易得多。也就是说,不是将大约 7 天的信息存储在不同的列中,而是将信息存储在不同的行中。