累积百分比分类查询

时间:2012-03-12 23:22:06

标签: sql sql-server-2005

我有一个问题,一直在推动我的问题。 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类别,但它需要是成本的累积百分比,即。 'A'部分占我成本的80%,'B'部分占下一个15%,'C'部分占最后5%。 sql语句显然比我所包含的更多,但我发布的代码是瓶颈。

非常感谢任何帮助!

AJ

2 个答案:

答案 0 :(得分:0)

试试这个:

;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

它应该可以提高您的查询速度。

答案 1 :(得分:0)

很抱歉延迟回应,但我已经在其他方面做到了,但经过大量的反复试验后,我发现以下是最快的方法:

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