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

标签 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 放弃 6563461 6850345

当放弃计数与只能降低计数的附加条件相同的值时,为什么 all_addtocart 低于放弃。

这是在支持 ANSI SQL 的 AWS athena 上

最佳答案

您显然正在使用一个数据库产品,它会愉快地将谓词值隐式转换为可以COUNT编辑1的值,并且,如果Paul的假设是正确的,则它可以生成您列出的结果的唯一方法是,如果它同时 COUNTTRUEFALSE 结果,并且仅从其计数中排除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/

相关文章:

mysql - 计算联接中的字段并将结果分组到表中

mysql - Windows 上 MySQL CE 的无人值守安装(被动)

sql - 我们如何从 sql 脚本调用 c 函数

SQL Server复杂聚合过滤

amazon-web-services - 我如何自动续订我的 AWS 证书,为什么它不接受我分配的新证书?

azure - 在 Amazon AWS 上部署 Azure Stack

amazon-ec2 - 所有区域的单个 key 对

mysql - SQL:输出属于某个类别的所有名称,其中该类别中的所有国家/地区都相同

php - 如何在 Codeigniter Active 记录中编写 MYSQL 查询 !=?

SQL : Find the position of a character in a string value