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 放弃
6563461 6850345
当放弃计数与只能降低计数的附加条件相同的值时,为什么 all_addtocart 低于放弃。
这是在支持 ANSI SQL 的 AWS athena 上
最佳答案
您显然正在使用一个数据库产品,它会愉快地将谓词值隐式转换为可以COUNT
编辑1的值,并且,如果Paul的假设是正确的,则它可以生成您列出的结果的唯一方法是,如果它同时 COUNT
为 TRUE
和 FALSE
结果,并且仅从其计数中排除UNKNOWN
值(有时称为 NULL
,但在大多数产品中,这两个概念不会混为一谈)。
如果是这样,明显的解决方法是使用一些 CASE
表达式来确保当谓词计算结果为 TRUE 时,您仅计算
。这将避免意外的隐式转换,从而给您带来误导性的结果:COUNT
结果
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
这些 case 表达式确保我们只对 int
值执行 COUNT
操作,这些值要么是 1
(如果谓词为 true ) 或 NULL
。
1我不愿意将任何执行此操作的产品描述为“ANSI”,但同样,几乎每个真正的数据库产品都不完全符合 ANSI。
关于mysql - Ansi SQL 查询给出不合理的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42410765/