2011-09-07 104 views
0

我有這個表,我要計算每個TYPE_MATERIAL累計百分比累計百分比「組由」 /年SQL Server:在許多領域

declare @mytable table (TYPE_MATERIAL int, YEARS int, ROW_NUM int, PERCENTUAL_PRICE numeric(6,2)) 
insert @mytable 
select 1,2010,1,54.5 
union all select 1,2010,2,37.5 
union all select 1,2010,3,8.0 

union all select 1,2009,1,72.8 
union all select 1,2009,2,21.0 
union all select 1,2009,3,6.2 

union all select 2,2010,1,61.0 
union all select 2,2010,2,36.0 
union all select 2,2010,3,3.0 

結果應該是這樣的:

TYPE_MATERIAL YEARS  ROW_NUM  PERCENTUAL_PRICE PERCENTUAL_PRICE_cumulative 
1    2010  1   54.50    54.5 (=54.5) 
1    2010  2   37.50    92.0 (=54.5+37.5) 
1    2010  3   8.00    100.0 (=54.5+37.5+8) 
1    2009  1   72.80    72.8 
1    2009  2   21.00    93.8 
1    2009  3   6.20    100.0 
2    2010  1   61.00    61.0 
2    2010  2   36.00    97.0 
2    2010  3   3.00    100.0 

我在互聯網上找到此查詢,但由於其計算累積百分比只有當我有一個TYPE_MATERIAL和一年

這不利於這種情況下,

有什麼建議嗎? 感謝

回答

2
select TYPE_MATERIAL, YEARS, ROW_NUM, PERCENTUAL_PRICE, 
PERCENTUAL_PRICE_cumulative= 
(
select SUM(PERCENTUAL_PRICE) from @mytable b 
where b.ROW_NUM<=a.ROW_NUM AND b.YEARS = a.YEARS AND b.TYPE_MATERIAL = a.TYPE_MATERIAL 
) 
from @mytable a 
+0

它簡單而完美!謝謝!! @Seph也與CTE這是一個好主意.. – Paolo

1

你的問題是由內部查詢不限制在type_material和多年造成的。

select TYPE_MATERIAL, YEARS, ROW_NUM, PERCENTUAL_PRICE, 
PERCENTUAL_PRICE_cumulative= 
(
select SUM(PERCENTUAL_PRICE) from @mytable b 
where b.ROW_NUM<=a.ROW_NUM AND b.type_material = a.type_material AND b.years = a.years 
) 
from @mytable a 

你也可以做一個遞歸CTE,它應該可以執行非常大的數據。

with myCte (TYPE_MATERIAL, YEARS, ROW_NUM, PERCENTUAL_PRICE, PERCENTUAL_PRICE_cumulative) 
as 
(
    select TYPE_MATERIAL, YEARS, ROW_NUM, PERCENTUAL_PRICE, PERCENTUAL_PRICE AS PERCENTUAL_PRICE_cumulative 
    FROM @mytable 
    WHERE row_num = 1 
    UNION ALL 
    select t.TYPE_MATERIAL, t.YEARS, t.ROW_NUM, t.PERCENTUAL_PRICE, CAST(t.PERCENTUAL_PRICE + myCte.PERCENTUAL_PRICE_cumulative AS numeric(6,2)) AS PERCENTUAL_PRICE_cumulative 
    FROM @mytable t 
     INNER JOIN myCte ON myCte.type_material = t.type_material AND myCte.years = t.years AND mycte.row_num = t.row_num-1 
    WHERE t.row_num > 1 
) 
SELECT * FROM myCte 
ORDER BY TYPE_MATERIAL, YEARS, ROW_NUM