mysql中的求和不能正常工作并返回0

时间:2014-01-16 21:14:43

标签: mysql

我有一个SQL查询如下:

enter image description here

但问题是如果dataitem = 3的第二个选择返回null,则整个计算变为0.例如,对于第一个选择,我有100,第二个选择返回null。添加它们应该会产生100但它会返回0 !!!!!

任何人都可以说出原因,还有什么可以摆脱它? 这里也是可复制的代码:

select( (
    SELECT sum(Sentiment) 
      FROM entity_epoch_data 
     WHERE EpochID IN 
              (SELECT ID 
                 FROM epoch 
                WHERE StartDateTime>='2013-11-1' 
                  AND EndDateTime<='2013-11-30') 
       AND EntityID =86 
       AND DataitemType=0
       )+
      (SELECT sum(Sentiment) 
         FROM entity_epoch_data 
        WHERE EpochID IN 
              (SELECT ID 
                 FROM epoch 
                WHERE StartDateTime>='2013-11-1' 
                  AND EndDateTime<='2013-11-30') 
          AND EntityID =86 
          AND DataitemType=3)
    )

3 个答案:

答案 0 :(得分:1)

只需添加代表IFNULL命令的值的SQL,如IFNULL((select sum()......), 0)它就可以正常工作。

但是有点和平的建议。您应该改进该查询。 我认为这个查询你做同样的事情。

    SELECT sum(entity_epoch_data.Sentiment) 
      FROM entity_epoch_data INNER JOIN epoch
            ON entity_epoch_data.EpochID = epoch.id
     WHERE epoch.StartDateTime>='2013-11-1' 
       and epoch.EndDateTime<='2013-11-30'
       AND entity_epoch_data.EntityID =86 
       and entity_epoch_data.DataitemType in (0,3)

您正在对DataitemType 3和0的总和求和,它只能是一个带连接的查询

答案 1 :(得分:1)

添加null是未定义的,因此返回null或0.您可以使用CASE表达式来避免该问题。

SELECT SUM(CASE null = sentiment THEN 0 ELSE sentiment END) FROM ....

如果您的数据库不支持SUM()函数内的CASE,请创建一个使用CASE将空值替换为0的VIEW。

答案 2 :(得分:1)

使用CASE语句代替您正在使用的语句。

select sum(case when StartDateTime>='2013-11-1' and EndDateTime<='2013-11-30' and       DataitemType=0 then Sentiment else 0 end) as Sentiment_0, sum(case when StartDateTime>='2013-11-1' and EndDateTime<='2013-11-30' and DataitemType=3 then Sentiment else 0 end) as Sentiment3 from (tables_joined) where  EntityID =86