SQL查询以查找只包含另一列的一部分的列的总数?
这些订单中有多少是仅饮料而不包括食品SQL查询以查找只包含另一列的一部分的列的总数?,sql,postgresql,count,unique,where-clause,Sql,Postgresql,Count,Unique,Where Clause,这些订单中有多少是仅饮料而不包括食品 fact_order_id fact_order_line_id category Group category Name 我尝试了下面的代码,但它给了我所有包含饮料的事实订单ID。正如您在上面看到的,一些事实订单ID包含饮料和食品项目 select count(fact_order_id) from table WHERE category_group in ('Beverage (specialty)','Beverage (non-alcohol)'
fact_order_id
fact_order_line_id
category Group
category Name
我尝试了下面的代码,但它给了我所有包含饮料的事实订单ID。正如您在上面看到的,一些事实订单ID包含饮料和食品项目
select count(fact_order_id)
from table
WHERE category_group in ('Beverage (specialty)','Beverage (non-alcohol)')
有没有一种方法可以让事实订单ID只包含一个项目(如饮料),而不让事实订单ID作为SQL查询返回类别组中的食品?请尝试一下。直到我刚才试了一下,我才知道这能起作用 过滤条件统计饮料%的数量,并将其与事实\u订单\u id中的总数
计数(*)
进行比较
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偷了另一个变体,它使用boolean
的avg()
转换为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
;
只要您的命名约定一致,任何一种都应与类似
:
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
当您可以使用
min()
或更好的bool\u和()
时,avg()
似乎是一个奇怪的选择。感谢您的选择!我正在使用PostgreSQL。对于第一个选项,我得到了错误无效操作:在“过滤器”位置或附近出现语法错误
。第二个选项,我得到错误无效操作:输入位置末尾的语法错误
。第三个选项似乎有效,但在进行计数(事实\u订单\u id)
时,它并没有给我一个总计数。@娜塔莎,我添加了这个查询来获得仅饮料订单的计数。你在用什么版本的PG?@GordonLinoff-Heh。我很确定我从你那里得到了avg()
。也就是说,bool_和()<代码>过滤器
在9.4中出现。我不知道为什么第二个不适合你。