对于大学项目,我必须根据一个表的数据计算kpi。该表存储有关超市购物篮和购物订单项及其产品类别的数据。我必须计算在特定商店购买的所有产品类别的产品。所以在表中它看起来像这样:
StoreId BasketID CategoryId
1 1 1
1 1 2
1 1 3
1 2 1
1 2 3
1 2 4
2 3 1
2 3 2
2 3 3
2 4 1
作为查询的结果,我想要一个表来计算与商店相关的所有购物篮中的不同产品类别。 像这样:
StoreId Count(CategoryId)
1 4
2 3
如果我使用硬值进行非动态语句,则表明它正在运行。
select basket_hash, store_id, count(DISTINCT retailer_category_id)
from promo.checkout_item
where store_id = 2
and basket_hash = 123
GROUP BY basket_hash, store_id;
但是当我尝试以动态方式编写它时,sql会计算每个篮子的数量并将单个数量加在一起。
select store_id, Count(DISTINCT retailer_category_id)
from promo.checkout_item
group by store_id;
但是像这样,它并没有比较与商店相关的所有篮子的类别,而且我得到重复,因为一个类别可以在篮子1和篮子2中。
有人可以帮忙吗?!
THX!
答案 0 :(得分:1)
根据您的预期结果,您想要以下声明吗?
SELECT StoreId, COUNT(*)
FROM (
SELECT DISTINCT StoreId, CategoryId
FROM table_name
)
GROUP BY StoreId;
请在表格中用表名替换“table_name”。
我不确定什么是“动态方式”的意思。
答案 1 :(得分:0)
我对你的要求感到困惑。这就是我想你的意思:
with checkout_item (store_id, basket_hash, retailer_category_id) as (
values
(1,1,1),(1,1,2),(1,1,3),(1,2,1),(1,2,3),
(1,2,4),(2,3,1),(2,3,2),(2,3,3),(2,4,1)
)
select distinct store_id, basket_hash, store_cats, basket_cats
from (
select store_id, basket_hash,
max(store_cats) over (partition by store_id) as store_cats,
max(basket_cats) over (partition by basket_hash) as basket_cats
from (
select store_id, basket_hash,
dense_rank() over (
partition by store_id
order by retailer_category_id
) as store_cats,
dense_rank() over (
partition by basket_hash
order by retailer_category_id
) as basket_cats
from checkout_item
) s
) s
order by 1, 2
;
store_id | basket_hash | store_cats | basket_cats
----------+-------------+------------+-------------
1 | 1 | 4 | 3
1 | 2 | 4 | 3
2 | 3 | 3 | 3
2 | 4 | 3 | 1