Как заполнить столбец Да или Нет на основе значений отклонения другого столбца - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь заполнить Да или Нет в столбце Перемещение, основываясь на диапазоне значений в столбце «Дисперсия», который относится к 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

Ожидаемый пример результата

Expected

Фактический результат

Actual

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...