2012-03-12 165 views
0

我有一個查詢,一直在把我拉上牆。 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

可能的示例數據和結果將有所幫助 – 2012-03-12 23:34:38

+0

對不起,您是正確的,萬一在此帖子中發生任何其他情況,結果只是一個部件號,它是一段時間內的總銷售額,以及從最大銷售訂單到自動編號列最低的銷量。 (實際零件號和美元值並不特別相關)。 – Aaj 2012-03-27 12:27:52

回答

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

它應該給你的查詢速度提升。