2010-05-17 7 views
2

J'ai une table de données de vente par exemple:Comment Compute pour ABCIndicator dans T-SQL

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

Le ShareOfBusiness est calculé comme (TotalYearlySales/SUM(TotalYearlySales))*100

Le ABCIndicator de l'élément est A pour la liste des articles dont la somme est de 80% de la somme (ShareOfBusiness). B pour les 15% suivants et C pour les 5% restants. Comment puis-je obtenir l'ABCIndicator pour chaque article?

données Exemple:

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 
+0

peut vous fournir un certain échantillon/sortie de données? –

Répondre

1

Vous pouvez calculer la somme et la somme cumulée dans une sous-requête. La somme cumulée est le montant total des ventes pour cette ligne et les lignes avec une somme plus élevée.

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 

Cette impression:

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

Je pense que votre problème aura besoin l'application de la fonction NTILE(). here

1

Peut-être quelque chose comme

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