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
这些订单中有多少只不包括食物?
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