Ansi SQL查询给出了不合理的结果

时间:2017-02-23 08:42:59

标签: mysql sql amazon-web-services select group-by

SELECT 
count(added_to_cart=1 ) AS all_addtocart,
count(added_to_cart =1 AND purchased IS NULL) AS abandonment
FROM emr_data 
WHERE y='2017' AND m= '01'
ORDER BY count(*) DESC

此查询提供:

all_addtocart abandonment 6563461 6850345

如果放弃计算相同的值并使用只能降低计数的附加条件,all_addtocart如何低于放弃。

这是在AWS athena上支持ANSI SQL

1 个答案:

答案 0 :(得分:1)

您显然正在使用数据库产品,该数据库产品可以将谓词值隐式转换为可以COUNT ed 1 的值,如果Paul的假设是正确的,那么唯一的方法就是它可以生成您列出的结果,如果它COUNT TRUEFALSE结果{且}只排除其计数UNKNOWN值(有时称为{{} 1}},但在大多数产品中,这两个概念并没有混合在一起。)

如果是这样,那么显而易见的解决方法是使用一些NULL表达式,以确保在谓词评估为CASE时只有COUNT结果。这样可以避免意外的隐式转换,从而产生误导性结果:

TRUE

这些案例表达式确保我们只针对SELECT count(CASE WHEN added_to_cart=1 THEN 1 END) AS all_addtocart, count(CASE WHEN added_to_cart =1 AND purchased IS NULL THEN 1 END) AS abandonment FROM emr_data WHERE y='2017' AND m= '01' ORDER BY count(*) DESC 值执行COUNT,这些值为int(如果谓词为真)或1。< / p>

1 我会毫不犹豫地将任何产品描述为“ANSI”,但同样,几乎每个真正的数据库产品都不完全符合ANSI。