SQL-为什么子查询的输出会多次显示我的答案?

时间:2018-11-11 22:15:54

标签: mysql sql subquery

对于表中的行数,将重复以下查询的输出。任何人都可以解释为什么以及是否使用“限制1”解决此问题的好习惯吗?

SELECT

CAST((SELECT COUNT(event_id)
FROM creation_funnel
WHERE Ds = 2018-10-01 AND action = "publish") AS float) / 

CAST((SELECT COUNT(DISTINCT event_id)
FROM creation_funnel
WHERE Ds = 2018-10-01) AS float)
 * 100.0

FROM creation_funnel;

2 个答案:

答案 0 :(得分:2)

此查询将是有条件聚合的理想选择,因为它使您可以摆脱两个子查询。尝试以下方法:

SELECT
    COUNT(CASE WHEN Ds = '2018-10-01' AND action = 'publish' THEN event_id END) /
    COUNT(DISTINCT CASE WHEN Ds = '2018-10-01' THEN event_id END) * 100 AS percent_published
FROM creation_funnel

请注意,日期字符串需要用引号引起来,如@Strawberry指出,2018-10-01被解释为整数表达式,计算结果为2007。

与查询相比,该查询还将只为您提供一个结果,这将为表中的每一行提供一个结果。删除FROM子句或添加LIMIT 1都可以解决此问题,但是使用条件聚合是更好的选择。

答案 1 :(得分:-2)

SELECT
CAST((SELECT COUNT(event_id) FROM creation_funnel WHERE Ds = '2018-10-01' AND action = "publish") AS float) /
CAST((SELECT COUNT(DISTINCT event_id) FROM creation_funnel WHERE Ds = '2018-10-01') AS float) * 100.0

重复是因为语句的FROM部分。去掉它。 您正在获得多个结果,因为正在为表中的每个记录运行选择。

已更新

根据尼克的说法。您可以简化他对以下内容的回答。

SELECT 
    COUNT(CASE WHEN action = 'publish' THEN event_id ELSE 0 END) / 
    COUNT(DISTINCT event_id) * 100 AS percent_published
FROM creation_funnel
WHERE Ds = '2018-10-01';