Как вычислить для ABCIndicator в T-SQL - PullRequest
2 голосов
/ 17 мая 2010

У меня есть таблица данных о продажах, например:

SELECT ItemCode, ItemDesc, TotalYearlySales, ShareOfBusiness, ABCIndicator
FROM Sales
WHERE Yir = Year(getdate())
AND Manth = Month(getdate())
ORDER BY TotalYearlySales DESC

ShareOfBusiness рассчитывается как позиция (TotalYearlySales/SUM(TotalYearlySales))*100

ABCIndicator - это A для списка товаров, сумма которых составляет 80% от суммы (ShareOfBusiness). B для следующих 15% и C для последних 5%.

Как я могу получить ABCIndicator для каждого предмета?

Пример данных:

ItemCode ItemDesc      TotalYearlySales ShareOfBusiness ABCIndicator
1234     Yellow Flute  3000             .36             A
1235     Brown Violin  2000             .24             A
1236     Silver Flute  1800             .21             A
1236     Pink Drums    1500             .18             B

Ответы [ 3 ]

1 голос
/ 17 мая 2010

Вы можете вычислить сумму и промежуточную сумму в подзапросе. Промежуточная сумма - это общая сумма продаж для этой строки и строк с более высокой суммой.

select
    ItemCode
,   ItemDesc
,   TotalYearlySales
,   TotalYearlySales / SalesSum as Share
,   case when RunningSum > 0.2 * SalesSum then 'A'
         when RunningSum > 0.05 * SalesSum then 'B'
         else 'C'
    end as ABCIndicator    
from (
    select
        ItemCode
    ,   ItemDesc
    ,   TotalYearlySales
    ,   (
        select sum(TotalYearlySales) 
        from @Sales t1
        where Yir = Year(getdate())
        ) as SalesSum
    ,   (
        select sum(TotalYearlySales) 
        from @Sales t2
        where Yir = Year(getdate()) 
              and TotalYearlySales <= t3.TotalYearlySales
        ) as RunningSum
    from @Sales t3
    where Yir = Year(getdate())
) sub

Это печатает:

ItemCode  ItemDesc      TotalYearlySales  Share  ABCIndicator
1234      Yellow Flute  3000              0,36   A
1235      Brown Violin  2000              0,24   A
1236      Silver Flute  1800              0,21   A
1236      Pink Drums    1500              0,18   B
1 голос
/ 17 мая 2010

Может быть, что-то вроде

Select *
    , ABCIndicator = case when ShareOfBusiness > 80 then 'A'
                    when ShareOfBusiness > 65 then 'B'
                    else 'C' --or whatever logic you need
                    End
From
(
    Select *
    ,ShareOfBusiness = MonthlySales/TotalYearlySales*100
    From
    (
        SELECT ItemCode
        , ItemDesc
        , Sum(Sales) TotalYearlySales
        ,Sum(case when Manth = Month(getdate()) then Sales else 0 end) MonthlySales
        --, ShareOfBusiness, ABCIndicator
        FROM Sales
        WHERE Yir = Year(getdate())
        Group By ItemCode, ItemDesc
    ) SalesSummary
) ShareOfBusiness
ORDER BY TotalYearlySales DESC
1 голос
/ 17 мая 2010

Я думаю, что ваша проблема потребует применения функции NTILE (). Здесь можно прочитать

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