SQL 查询查找仅包含另一列的一部分的列的总数?

SQL query to find a total number of a column that only includes parts of another column?

这些订单中有多少只不包括食物

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 查询?

请试一试。在我刚才尝试之前,我不知道这会起作用。

过滤条件统计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() of 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;

这在 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