, используя Гордона в секунду SQL, но показывая, что он работает в Снежинке
select v.*
,count(distinct store) over (partition by item) as num_stores
,count(distinct iff(promo_flg = 1, store, null)) over (partition by item) as num_dis_promo_stores
,sum(iff(promo_flg = 1, 1, 0)) over (partition by item) as num_sum_promo_stores
from values
(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 )
v(store, item, promo_flg) ;
, дает:
STORE ITEM PROMO_FLG NUM_STORES NUM_DIS_PROMO_STORES NUM_SUM_PROMO_STORES
1 1 0 10 4 4
2 1 1 10 4 4
3 1 0 10 4 4
4 1 0 10 4 4
5 1 1 10 4 4
6 1 1 10 4 4
7 1 1 10 4 4
8 1 0 10 4 4
9 1 0 10 4 4
10 1 0 10 4 4
Таким образом, в зависимости от того, хотите ли вы отдельный счет или сумму, оба, Я использовал нестандартную форму SQL, которая поддерживает снежинку iff
, так как я предпочитаю, чтобы она была меньше sql. Но вы можете видеть их работу.
тестирование второго случая Гордона count(distinct case when promo_flg = 1 then store end) over (partition by item) as num_promo_1
работает как написано.
Чтобы ответить на вопрос Marcin2x4 об ответе Гордона, вы получите разные результаты от методов, если / когда данные отклоняются от того, как вы описали Это. Таким образом, в случае, если у вас есть магазин, есть элемент и несколько строк с promo_flg. Или, если promo_flg имеет ненулевые значения:
select v.*
,count(distinct store) over (partition by item) as num_stores
,count(distinct iff(promo_flg = 1, store, null)) over (partition by item) as num_dis_promo_stores
,sum(iff(promo_flg <> 0, 1, 0)) over (partition by item) as num_sum_promo_stores
,sum(promo_flg) over (partition by item) as num_promo_1
,count(distinct case when promo_flg = 1 then store end) over (partition by item) as num_promo_1
from values
(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 ),
(7, 1, 1 ),
(7, 1, 2 )
v(store, item, promo_flg) ;
, тогда num_dis_promo_stores
& num_promo_1
дает 4, num_sum_promo_stores
дает 6, & num_promo_1
дает 7