I have data of products that are sold by various shops. For some shops they are sold with discount mapped by PROMO_FLG.
I would like to display two COUNT PARTITION columns.
+-------------------------+--------------+---------------------+ | Store | Item | PROMO_FLG| |-------------------------+--------------+---------------------| | 1 | 1 | 0 | | 2 | 1 | 1 | | 3 | 1 | 0 | | 4 | 1 | 0 | | 5 | 1 | 1 | | 6 | 1 | 1 | | 7 | 1 | 1 | | 8 | 1 | 0 | | 9 | 1 | 0 | | 10 | 1 | 0 | +-------------------------+--------------+---------------------+
First displays all shops that thave this product (which is done)
COUNT(DISTINCT STORE) OVER (PARTITION ITEM) would give is 10
Second one – which I seek – counts only these shops that have value in PROMO_FLG = 1 attribute.
That should give us value of 4
Advertisement
Answer
I think you want:
select t.*,
count(*) over (partition by item) as num_stores,
sum(promo_flg) over (partition by item) as num_promo_1
from t;
If you actually need distinct counts:
select t.*,
count(distinct store) over (partition by item) as num_stores,
count(distinct case when promo_flg = 1 then store end) over (partition by item) as num_promo_1
from t;
Here is a db<>fiddle. The fiddle uses Oracle because it supports COUNT(DISTINCT) as a window function.
Here is an alternative, if the window functions don’t work:
select *
from t join
(select item, count(distinct store) as num_stores, count(distinct case when promo_flg = 1 then store end) as num_stores_promo
from t
group by item
) tt
using (item);