首页 > 解决方案 > 如何在总行中使用“按组分组”和“有”?

问题描述

我创建了这个 SQL 命令:

select
    product_category_name a,
    count(product_id) b
from
    sys.odeds_2_20210811095253
group by
    grouping sets ((product_category_name), ())

结果是这样的:

a            b     
-------------------
Eletrônico   74    
Escritório   70    
Fruta        310   
Limpeza      37    
Utensílio    69    
Ferramenta   39    
Laticínio    32    
Bebida       72    
Móvel        27    
Grãos        53    
Higiene      57    
Informática  64    
Farmácia     26    
Verdura      23    
Vestuário    23    
Brinquedo    13    
Veículo      11    
<null>       1000 

是正确的。但是,现在我想对组进行过滤。然后我将命令更改为如下所示:

select
    product_category_name a,
    count(product_id) b
from
    sys.odeds_2_20210811095253
group by
    grouping sets ((product_category_name), ())
having
    grouping(product_category_name) = 1 or count(product_id) between 40 and 60

结果是这样的:

a        b     
---------------
Grãos    53    
Higiene  57    
<null>   1000 

但是,最后一行的结果并不像我预期的那样。我希望最后一行返回“110”(对应于 53 + 57)而不是“1000”。

有人可以帮我解决这个挑战吗?

标签: monetdb

解决方案


have 子句正在对分组集进行过滤,所以我认为该查询不会完成这项工作。您可以改用以下查询。我又添加了一个子查询,因为我不喜欢使用 having 子句,所以它在通用表达式消除上少了一个优化步骤;)

with totals(a, b) as
(
select a, b from
(
select
    product_category_name a,
    count(product_id) b
from
    sys.odeds_2_20210811095253
group by
    product_category_name
) sub(a, b)
where b between 40 and 60
)
select a, b from totals
union all
select null, sum(b) from totals;

推荐阅读