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

问题描述

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

fact_order_id
fact_order_line_id
category Group
category Name

我已经在下面尝试过此代码,但是它给了我所有其中包含饮料的fact_order_id。正如您在上面看到的那样,一些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()中的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中有效,其中boolean转换为整数不可用

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