Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:带“的累积百分比”;分组方式;在许多领域_Sql_Sql Server_Cumulative Sum - Fatal编程技术网

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