带有SUM的IF在MySQL中产生不正确的结果

时间:2018-03-29 02:24:13

标签: mysql if-statement sum

当我尝试将SUM插入到IF子句中时,我得到的结果不正确。当我使用COUNT时,结果是正确的,当我使用SUM时,它是错误的或NULL。我已经能够通过另一个查询(作为验证公式的方法)为每个语句生成正确的结果。在IF语句中获取正确结果的语法是什么?基于另一个StackOverflow问题,我试图修复公式,但它产生了一个错误。

SELECT
IF (Artist LIKE '%Hillsong%' , 'Hillsong', NULL ) as Artist,

COUNT(IF(CCD BETWEEN 28 AND 730,1,NULL)) AS 1_CC,    -- result 191, which is correct 
IF(CCD BETWEEN 28 AND 730, SUM(CC28),NULL) AS 2_CC,  -- result NULL, should be 610   xx
COUNT(IF(CCD > 28,1,NULL)) AS 3_CC,                  -- result 684, which is correct 
COUNT(IF(CCD < 730,1,NULL)) AS 4_CC,                 -- result 502, which is correct 
IF(CCD > 28,SUM(CC28),NULL) AS 5_CC,                 -- result 2253, should be 1882  xx
--- SUM(IF(CCD > 28,CC28,NULL) AS 6_CC,              -- my attempt to fix, creates error
IF(CCD < 730,SUM(CC28),NULL) AS 7_CC                 -- result NULL, shoul be 981    xx

FROM praisecharts_reporting.large_sales_report
GROUP BY 1;

作为参考框架,我是一名音乐出版商,我正在努力获得艺术家所包含的所有歌曲的结果&#34; Hillsong&#34;,其中和弦图表(CC)在28之间可用和730天(CCD在28和730之间)。 COUNT应该告诉我有多少歌曲合格,而SUM应该告诉我所有合格歌曲的总销量。

3 个答案:

答案 0 :(得分:1)

我找到了问题的答案。将IF子句放在SUM中的语法是使用CASE WHEN。下面是我上面的查询的解决方案,它产生了正确的结果:

SELECT
IF (Artist LIKE '%Hillsong%' , 'Hillsong', NULL ) as Artist,

COUNT(IF(CCD BETWEEN 28 AND 730,1,NULL)) AS 1_CC,
SUM(CASE WHEN CCD BETWEEN 28 AND 730 THEN CC28 ELSE 0 END) AS 2_CC,
COUNT(IF(CCD > 28,1,NULL)) AS c3_CC,  
COUNT(IF(CCD < 730,1,NULL)) AS c4_CC, 
SUM(CASE WHEN CCD > 28 THEN CC28 ELSE 0 END) AS 5_CC,
SUM(CASE WHEN CCD < 730 THEN CC28 ELSE 0 END) AS 6_CC

FROM praisecharts_reporting.large_sales_report
GROUP BY 1;

答案 1 :(得分:0)

如果没有基础数据,就很难验证结果。但是你的NULL结果可能是由于数据中的底层NULL或条件子句所致。

尝试将SUM(CC28)替换为SUM(IFNULL(CC28,0))

整数和NULL之和等于NULL。因此,您可能在第二组中获得NULL。

答案 2 :(得分:0)

您尝试使用SUM - IF

时应该走在正确的轨道上
--- SUM(IF(CCD > 28,CC28,NULL) AS 6_CC,              -- my attempt to fix, creates error

如果你仔细观察,你会错过一个结束括号。我们必须注意收到的错误。很可能您在AS 6_CC,之后收到语法错误。

只需在NULL之后添加右括号:

SUM(IF(CCD > 28,CC28,NULL)) AS 6_CC, 

尝试在其他列上使用SUM - IF。如果有效,请告诉我。

使用SUM - IF,您可以获得true / false结果,这很简单(尽管您可以嵌套,但这会使其无法读取)。< / p>

使用SUM - CASE,您可以选择通过提供更多条件获得更多结果,就像SWITCH语句一样。