我有一个SQL查询如下:
但问题是如果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)
)
答案 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