SQL Server:带“的累积百分比”;分组方式;在许多领域
我有这个表,我想计算每种类型的材料/年的累积百分比SQL Server:带“的累积百分比”;分组方式;在许多领域,sql,sql-server,cumulative-sum,Sql,Sql Server,Cumulative Sum,我有这个表,我想计算每种类型的材料/年的累积百分比 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,7
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_材料和一年的情况下计算累积百分比
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
)
from @mytable a
选择类型、材料、年份、行数、百分比价格、,
累计价格百分比=
(
从@mytable b中选择总和(百分比价格)
其中b.行数<代码>选择类型、材料、年份、行数、百分比价格,
累计价格百分比=
(
从@mytable b中选择总和(百分比价格)
其中,b.ROW_NUM您的问题是由于您的内部查询不限制类型_材料和年份造成的
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
这应该通过窗口函数而不是递归或子查询来解决:
SELECT
type_material, years, row_num, percentual_price
SUM (percentual_price) OVER (PARTITION BY type_material, years ORDER BY row_num) cumulative
FROM @mytable
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
SELECT
type_material, years, row_num, percentual_price
SUM (percentual_price) OVER (PARTITION BY type_material, years ORDER BY row_num) cumulative
FROM @mytable