我有一个问题,一直在推动我的问题。 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
答案 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