2011-09-07 5 views
0

に私はこのテーブルを持っている、と私は、累積比率を計算したい「でグループ」との累積パーセンテージSQL Serverの各TYPE_MATERIAL /年間、多くの分野

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 

私は、インターネット上でこのクエリを見つけたが、それは私が1 TYPE_MATERIALと1年

を持っている場合にのみ、累積比率を計算するので、この場合のために良いではありません

提案がありますか? THANKS

答えて

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 

また、大規模なデータに対してokを実行する再帰的な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 
関連する問題