当我尝试将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应该告诉我所有合格歌曲的总销量。
答案 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
语句一样。