【问题标题】:PostgreSQL SUM CASE expression with THEN 1 THEN 0 ELSE 0PostgreSQL SUM CASE 表达式与 THEN 1 THEN 0 ELSE 0
【发布时间】:2019-01-20 01:53:28
【问题描述】:

在研究我的 CASE 表达式问题的答案时,我找不到我想要的东西。目的是对“活动”帐户的出现次数进行求和。但是,在查看结果后,我不想将活动帐户上的一组参数包含在我的 SUM 值中。这是原始的 SUM CASE:

 sum(
    CASE
        WHEN (type_txt = 'ACCOUNT'::text AND status = 'ACTIVE' THEN 1
        ELSE 0
    END) AS accounts_actv

但是,我重新编写了代码,以便在不应计算活动帐户的特殊情况下计算:

 sum(
    CASE
        WHEN (type_txt = 'ACCOUNT' AND status = 'ACTIVE' THEN 1
        WHEN (type_txt = 'ACCOUNT' AND status = 'ACTIVE' AND code = 483 AND open_date < CURRENT_DATE) THEN 0
        ELSE 0
    END) AS accounts_actv

我认为,THEN 1 ELSE 0 不能有 THEN 条件为 0 ---- 所以我想弄清楚如何在 SUM 中不包含这种类型的帐户

【问题讨论】:

  • count(*) filter (where ....) 可能更容易阅读

标签: sql postgresql expression case


【解决方案1】:

将附加条件放在相同的情况下:

sum(
    CASE
        WHEN 
            type_txt = 'ACCOUNT'::text 
            AND status = 'ACTIVE' 
            AND NOT (code = 483 AND open_date < CURRENT_DATE) 
        THEN 1
        ELSE 0
    END) AS accounts_actv

【讨论】:

  • 实际上,一旦我查看它,这并没有给我想要的结果。你能帮忙吗?上面的结果计算了所有项目 WHERE type = Account and status = active BUT DID NOT COUNT any case in type = account AND status = active AND code = 483 AND open_date
  • 如有疑问,请检查所有可能性。请查看the example 并告诉哪些 id 有错误的结果。
  • 您的智慧之言绝对有帮助——并在您的示例中看到了这一点。我将我的问题追溯到 open_date 表中的 NULL 值——它们超出了我的计数。
【解决方案2】:

CASE 返回第一个(从上到下)THEN 表达式的值,该表达式的 WHEN 表达式计算结果为 true(如果没有匹配项,则返回 ELSE)。由于您的第一个WHEN 在第二个为真的情况下也为真,因此选择了第一个而不是第二个。始终将较窄的 WHEN 放在较窄的 CASE 之前。

CASE
    WHEN (type_txt = 'ACCOUNT' AND status = 'ACTIVE' AND code = 483 AND open_date < CURRENT_DATE) THEN 0
    WHEN (type_txt = 'ACCOUNT' AND status = 'ACTIVE' THEN 1
    ELSE 0
END

【讨论】:

    【解决方案3】:

    由于您只求和 1,因此 count(*) 过滤器(其中...)会更优雅。

    count(*) filter (
            where type_txt = 'ACCOUNT'::text 
            AND status = 'ACTIVE' 
            AND NOT (code = 483 AND open_date < CURRENT_DATE))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      相关资源
      最近更新 更多