【问题标题】:SQL - CASE WHEN result outputting conflicting resultsSQL - CASE WHEN 结果输出冲突结果
【发布时间】:2021-10-12 03:57:44
【问题描述】:

我正在努力解决 https://platform.stratascratch.com/coding/10065-find-whether-the-number-of-seniors-works-at-facebook-is-higher-than-its-number-of-usa-based-employees?python=

这是我尝试编写的查询:

SELECT CASE WHEN COUNT(CASE WHEN location = 'US' THEN 1 ELSE 0 END) >
    COUNT(CASE WHEN is_senior = true THEN 1 ELSE 0 END) THEN 'More USA-based'
    ELSE 'More seniors' END AS what_do_we_have_more_of
FROM facebook_employees

Result: 'More seniors'

但是,当我用翻转的条件重写它时:

SELECT CASE WHEN COUNT(CASE WHEN is_senior = true THEN 1 ELSE 0 END) >
    COUNT(CASE WHEN location = 'US' THEN 1 ELSE 0 END) THEN 'More seniors'
    ELSE 'More USA-based' END AS what_do_we_have_more_of
FROM facebook_employees

Result: 'More USA-based'

有人可以解释为什么这里有差异吗?我写的查询有什么问题?

我知道这个问题可以通过子查询来解决,但我想专门尝试CASE WHEN 方法。这样更有效率吗?

编辑:我用子查询编写的解决方案(条件相反)

WITH us_employees AS (
    SELECT id, location
    FROM facebook_employees
    WHERE location = 'US'
),

senior_employees AS (
    SELECT id, is_senior
    FROM facebook_employees
    WHERE is_senior = true
)

SELECT CASE WHEN COUNT(location) < COUNT(is_senior) THEN 'More seniors' ELSE 'More US-based' END AS what_do_we_have_more_of
FROM us_employees u
FULL JOIN senior_employees s
ON u.id = s.id

Result: 'More seniors'

【问题讨论】:

    标签: sql postgresql subquery case


    【解决方案1】:

    您的查询中count() 的使用不正确。但是你如何得到不同的结果呢?因为两个计数是一样的。所以A &gt; B 总是假的,你总是在ELSE 分支中结束。

    正确的查询可能如下所示:

    SELECT CASE WHEN count(*) FILTER (WHERE location = 'US')
                   > count(*) FILTER (WHERE is_senior) THEN 'More USA-based'
                WHEN count(*) FILTER (WHERE location = 'US')
                   < count(*) FILTER (WHERE is_senior) THEN 'More seniors'
                ELSE 'US-based and seniors tie' END AS what_do_we_have_more_of
    FROM   facebook_employees;
    

    见:

    注意,NULL 值永远不会失败,因为 count()(与大多数聚合函数不同)永远不会返回 NULL

    【讨论】:

      【解决方案2】:

      您应该使用SUM 而不是COUNT

      即使您的CASE 返回 1 或 0,COUNT 也会计数为 +1。

      SUM 仅在您的CASE 返回 1 时计为 +1。

      所以假设你的表有 1000 行,那么你的两个查询都是CASE 1000 &gt; 1000 THEN ... ELSE... END

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多