Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询以查找只包含另一列的一部分的列的总数?_Sql_Postgresql_Count_Unique_Where Clause - Fatal编程技术网

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中出现。我不知道为什么第二个不适合你。