SQL 具有仅包含另一列的部分功能的查询?

SQL query with having function to only includes parts of another column?

我正在尝试寻找 fact_order_id 有 纯饮料的商品 。这将使 fact_order_id 不包含任何食品。

fact_order_id
fact_order_line_id
category Group
category Name

我在下面使用了 2 个单独的 SQL 查询。当我回去检查我的工作时,我注意到输出 中的一些 fact_order_id 不是 仅限饮料的订单。这是给我相同输出的 2 个单独的 SQL 查询:

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


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

上面的两个输出都给我相同的行数。每当我交叉检查 fact_order_id 时,其中一些会包含带有食物的输出。

这个 fact_order_id 不应包含在我的输出中,因为订单上还有其他非饮料项目。有 2 个类别组具有饮料名称(饮料(非酒精)和饮料(特色))。是否有更好的方法来创建 SQL 查询以仅输出 fact_order_id 的饮料订单?

我正在使用 PostgreSQL 版本:08.00.0002

如何排除你知道不好的 fact_order_ids?

select distinct fact_order_id
from my_table
where fact_order_id not in (
    select distinct fact_order_id
    from my_table
    where not category_group like 'Beverage%'
);

根据你的 PostgreSQL 年龄,你能试试这个吗?

select fact_order_id
  from my_table
 group by fact_order_id
having bool_and((category_group like 'Beverage%'));

根据您的评论,您可以试试这个查询并分享您的结果吗?

select fact_order_id, category_group, category_name,
       (category_group like 'Beverage%') as is_beverage
  from my_table
 where fact_order_id = '1 292 757'

您可以在支票中加入您的table,看看是否有问题。从 SQL 的角度来看,以下查询是荒谬的,但它会自动执行您的 cross-checking:

with bev_orders as (
  select fact_order_id
    from my_table
   group by fact_order_id
  having bool_and((category_group like 'Beverage%'))
)
select *
  from my_table t
  join bev_orders b 
    on b.fact_order_id = t.fact_order_id
 where t.category_group not like 'Beverage%' ;