Я пытаюсь заполнить Да или Нет в столбце Перемещение, основываясь на диапазоне значений в столбце «Дисперсия», который относится к 3 продуктам в одном месяце для одного и того же клиента.
На рисунке под заголовком «Ожидаемый примерный результат» в столбце «Отклонение» для Customer1 и в 3-м месяце видно, что Customer1 потратил 22,24 долл. США на product1, на 655,53 долл. США меньше на product2 и потратил на 319,28 долл. США больше на product3, то есть они отдалили деньги от product1 и 2 и положить в 3.
Проблема в том, что меня больше всего беспокоит движение денег от продукта3 к продукту2 и 1, а не то, как деньги перемещаются в продукт3.
Приведенный ниже код является минимальным воспроизводимым рабочим примером, который частично изменен по сравнению с предыдущим вопросом, который я задавал здесь.
Нужна помощь в преобразовании формулы Excel if и sumif в мой код SQL Server
По сути, код говорит, что если максимальная дисперсия положительна, а минимальная отрицательна, то пометьте «да», иначе «нет». В некоторых сценариях нам не нужно «да», даже если это максимальная дисперсия, например, если product3 - максимальная дисперсия и она положительная или если product2 отрицателен, мы всегда хотим «нет».
В противном случае код работает, кроме случаев, когда product1 отрицателен, а product3 положителен, он помечает product1 как «да», и я не могу понять, как переопределить это и пометить его как «нет».
Я пытался
when Variance < 0 and Product = 'Product1'
and Max(Variance) over (partition by Customer, Mnth) > 0
and Product = 'Product3'
then 'No'
Также пробовал
when Variance < 0 and Product = 'Product1'
and Variance > 0 and Product = 'Product3'
then 'No'
Надеюсь, я не слишком объяснил, но дай мне знать, если мне нужно что-то прояснить.
with
baseData as
(
Select Customer, Product, Month(TransactionDate) as Mnth, sum(TransactionCharges + OtherCharges) as Charges,
case when Year(TransactionDate) = 2018 then 'prior'
else 'curr'
end as Status
From Storedfunction1 ('01-01-2018','12-31-2019')
where Customer <> 'internal' --EXCLUDE INTERNAL CUSTOMERS
and Product in ('Product1', 'Product2', 'Product3')
and Month(TransactionDate) < 5
group by Customer, Product, Month(TransactionDate), Year(TransactionDate), TransactionCharges, OtherCharges
),
getVariances as
(
Select Customer, Product, Mnth,
isnull(sum(case when Status = 'curr' then Charges end),0) - isnull(sum(case when Status = 'prior' then Charges end),0) as Variance,
case
when isnull(sum(case when Status = 'prior' then Charges end),0) = 0 and isnull(sum(case when Status = 'curr' then Charges end),0) > 0 then 'New'
when isnull(sum(case when Status = 'prior' then Charges end),0) >= 0 and isnull(sum(case when Status = 'curr' then Charges end),0) <= 0 then 'Terminated'
else 'Current'
end as Standing,
case
when isnull(sum(case when Status = 'prior' then Charges end),0) > 0 and isnull(sum(case when Status = 'curr' then Charges end),0) - isnull(sum(case when Status = 'prior' then Charges end),0) > 0 then 'Growth'
when isnull(sum(case when Status = 'prior' then Charges end),0) > 0 and isnull(sum(case when Status = 'curr' then Charges end),0) - isnull(sum(case when Status = 'prior' then Charges end),0) < 0 then 'Attrited'
when isnull(sum(case when Status = 'prior' then Charges end),0) >= 0 and isnull(sum(case when Status = 'curr' then Charges end),0) - isnull(sum(case when Status = 'prior' then Charges end),0) = 0 then 'Static'
when isnull(sum(case when Status = 'prior' then Charges end),0) < 0 and isnull(sum(case when Status = 'curr' then Charges end),0) - isnull(sum(case when Status = 'prior' then Charges end),0) > 0 then 'Growth'
when isnull(sum(case when Status = 'prior' then Charges end),0) <= 0 and isnull(sum(case when Status = 'curr' then Charges end),0) - isnull(sum(case when Status = 'prior' then Charges end),0) < 0 then 'Attrited'
else 'NA'
end as GrowOrAttrit
From baseData
group by Customer, Product, Mnth
)
Select *,
case
when GrowOrAttrit = 'Static' then 'No'
when Variance < 0 and Product = 'Product2' then 'No'
when Min(Variance) over (partition by Customer, Mnth) > 0 and Max(Variance) over (partition by Customer, Mnth) > 0 then 'No'
When Max(Variance) over (partition by Customer, Mnth) > 0 and Min(Variance) over (partition by Customer, Mnth) < 0 and Product = 'Product2' then 'Yes'
when Variance >= 0 and Standing = 'New' then 'No'
when Variance >= 0 then 'No'
when Max(Variance) over (partition by Customer, Variance) > 0 and Product = 'Product1' then 'No'
when Max(Variance) over (partition by Customer, Mnth) > 0 then 'Yes'
when Max(Variance) over (partition by Customer, Mnth) > 0 and Product = 'Product1' then 'No'
else 'No'
end as Move
From getVariances
order by 1,2,3
Ожидаемый пример результата
Фактический результат