Запрос кумулятивной процентной категоризации - PullRequest
0 голосов
/ 13 марта 2012

У меня есть запрос, который подталкивает меня к стене. Запрос t-sql выглядит следующим образом, но с исходной таблицей, насчитывающей около тысячи записей, он выполняется вечно и один день. Есть ли какой-нибудь более быстрый способ выполнить ту же задачу, о которой может подумать каждый:

SELECT *, ROUND((SELECT SUM(PartTotal) 
FROM PartSalesRankings 
WHERE Item_Rank <= sub.Item_Rank) /
 (SELECT SUM(PartTotal) 
  FROM PartSalesRankings) * 100, 2) as Cum_PC_Of_Total 
FROM PartSalesRankings As sub

Я пытаюсь классифицировать свой инвентарь по категориям A, B и C, основываясь на процентах от стоимости, но это должен быть совокупный процент стоимости, т.е. Части «А» составляют 80% моей стоимости, части «В» - следующие 15%, а части «С» - последние 5%. Очевидно, что в SQL-заявлении есть нечто большее, чем то, что я включил, но код, который я разместил, является узким местом.

Любая помощь будет принята с благодарностью!

Aj

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

Извините за задержку с ответом, но я был по уши в других вещах, но после большого количества проб и ошибок я нашел следующее, чтобы быть самым быстрым методом:

Select companypartnumber
     , (PartTotal + IsNull(Cum_Lower_Ranks, 0) ) / Sum(PartTotal) over() * 100 as Cum_PC_Of_Total
    from PartSalesRankings PSRMain
   Left join 
        (
            Select PSRTop.Item_Rank, Sum(PSRBelow.PartTotal) as Cum_Lower_Ranks
              from partSalesRankings PSRTop
              Left join PartSalesRankings PSRBelow on PSRBelow.Item_Rank < PSRTop.Item_Rank
             Group by PSRTop.Item_Rank 
        ) as PSRLowerCums on PSRLowerCums.Item_Rank = PSRMain.Item_Rank
) sub2
0 голосов
/ 13 марта 2012

Попробуйте:

;WITH SumPartTotal AS
(SELECT SUM(PartTotal) as SumPartTotal, Item_Rank
FROM PartSalesRankings 
GROUP BY Item_Rank
),
CumSumPartTotal AS
(SELECT SUM(Sub.SumPartTotal) as CumSumPartTotal, SPT.Item_Rank
FROM SumPartTotal as SPT
  INNER JOIN SumPartTotal as Sub ON
    SPT.Item_Rank >= Sub.Item_Rank
GROUP BY SPT.Item_Rank
),
SumTotal AS
(SELECT SUM(PartTotal) as SumTotal
FROM PartSalesRankings
)
SELECT *,
  ROUND((CumSumPartTotal.CumSumPartTotal * 100.0) / SumTotal.SumTotal, 2)  as Cum_PC_Of_Total 
FROM PartSalesRankings As sub
  INNER JOIN CumSumPartTotal ON
    sub.Item_Rank = CumSumPartTotal.Item_Rank
  INNER JOIN SumTotal ON
    sub.Item_Rank = SumTotal.Item_Rank

Это должно ускорить ваш запрос.

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