计算字段中的默认值

时间:2015-02-02 03:22:12

标签: sql sqlite

除非找到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

2 个答案:

答案 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