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
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);