【问题标题】:SQL query to find a total number of a column that only includes parts of another column?SQL查询查找仅包含另一列部分的列的总数?
【发布时间】:2020-12-11 06:06:21
【问题描述】:

这些订单中有多少是纯饮料不包括食物

fact_order_id
fact_order_line_id
category Group
category Name

我在下面尝试了这段代码,但它给了我所有包含饮料的 fact_order_ids。正如您在上面看到的,一些 fact_order_ids 有饮料和食品。

select count(fact_order_id)
from table
WHERE category_group in ('Beverage (specialty)','Beverage (non-alcohol)')

有没有办法让 fact_order_ids 只包含一个项目(仅像饮料)而不让 fact_order_ids 作为 SQL 查询返回类别组中的该食物?

【问题讨论】:

    标签: sql postgresql count unique where-clause


    【解决方案1】:

    请试一试。在我刚刚尝试之前,我不知道这可以工作。

    过滤条件计算Beverage%的数量,并将其与fact_order_id中的count(*)总数进行比较。

    select fact_order_id
      from your_table
     group by fact_order_id
    having count(*) filter 
             (where category_group in ('Beverage (specialty)', 'Beverage (non-alcohol)')
           = count(*) 
    ;
    

    几周前我无耻地从@GordonLinoff 窃取了另一个变体,它使用avg()boolean 转换为integer

    select fact_order_id
      from your_table
     group by fact_order_id
    having avg(
            (category_group in ('Beverage (specialty)', 'Beverage (non-alcohol)')::int) = 1
    ;
    

    只要您的命名约定一致,两者都应该与 like 一起使用:

    select fact_order_id
      from your_table
     group by fact_order_id
    having avg((category_group like 'Beverage%')::int) = 1
    ;
    

    要计算有多少这样的订单:

    with bev_only_orders as (
      select fact_order_id
        from your_table
       group by fact_order_id
      having avg((category_group like 'Beverage%')::int) = 1
    )
    select count(*)
      from bev_only_orders;
    

    【讨论】:

    • avg() 似乎是一个奇怪的选择,因为您可以使用 min() 或更好的 bool_and()
    • 感谢您的选择!我正在使用 PostgreSQL。对于第一个选项,我收到错误 Invalid operation: syntax error at or near "filter" Position。第二个选项,我收到错误Invalid operation: syntax error at end of input Position。第三个选项似乎有效,但是在执行count(fact_order_id) 时,它并没有给我一个总数。
    • @Natasha 我添加了查询以获取仅饮料订单的计数。你用的是什么版本的PG?
    • @GordonLinoff 呵呵。我很确定我收到了你的avg()。也就是说,bool_and() 会更好。
    • @Natasha 那是古老的。 filter 在 9.4 中出现。我不知道为什么第二个不适合你。
    【解决方案2】:

    这适用于布尔转换为整数不可用的 oracle

    select fact_order_id
      from your_table
     group by fact_order_id
    having avg(CASE WHEN category_group like 'Beverage%' THEN 1 ELSE 0 END)=1
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      相关资源
      最近更新 更多