0

我有一张包含付款清单的表格。当我尝试检索总计时,我得到不同的值,具体取决于我在 SUM() 中使用的列。

这是我的查询:

SELECT 
sum(Email_Broadcasting+Custom_Email_Newsletter+Digital_Newsletter+Mortgage_Matters) as EM,
sum(Resident_Lists+Consumer_Lists+Business_Lists+Email_Lists+Specialty_Lists) as DL,
sum(Database_Services+Email_Appending+Email_Cleansing) as DS,
sum(Email_Broadcasting+Custom_Email_Newsletter+Digital_Newsletter+Mortgage_Matters
+Resident_Lists+Consumer_Lists+Business_Lists+Email_Lists+Specialty_Lists
+Database_Services+Email_Appending+Email_Cleansing) as Total
FROM payment_orders

如您所见,Total 应该等于 EM+DL+DS,但这是我得到的值:

EM           DL         DS  Total
66122.79    772030.36   55403.67    328701.27

这并没有真正加起来。

难道我做错了什么?

4

2 回答 2

2

最可能的解释是 NULL 值。其中一些列中的一些值可能为 NULL。

例如

4 + 5 + 0     =>  9 

4 + 5 + NULL =>  NULL

如果要处理像 0 这样的 NULL 值,则将每个列引​​用包装在一个测试 NULL 并在值为 NULL 时返回零的函数中。

MySQLIFNULL()函数是执行此操作的一种方法:

IFNULL(4,0) + IFNULL(5,0) + IFNULL(NULL,0) =>  9

例如

SELECT SUM(IFNULL( Email_Broadcasting      ,0)
          +IFNULL( Custom_Email_Newsletter ,0)
          +IFNULL( Digital_Newsletter      ,0)
          +IFNULL( Mortgage_Matters        ,0) 
          ) as EM,

(I didn't verify that all of the columns from each of the subtotals is included in the total... that's obviously going to be a source of a problem, but I'm assuming that you've already checked that.)

于 2013-07-11T04:49:09.040 回答
-1

你有一个空值。sum() 不是空安全的。

于 2013-07-11T04:39:07.600 回答