SQL Server: совокупный процент с "group by" по многим полям - PullRequest
1 голос
/ 07 сентября 2011

У меня есть эта таблица, и я хочу рассчитать совокупный процент для каждого TYPE_MATERIAL / YEARS

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 и один ГОД

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

Есть предложения?БЛАГОДАРЯ

Ответы [ 3 ]

2 голосов
/ 07 сентября 2011
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
1 голос
/ 07 сентября 2011

Ваша проблема вызвана тем, что ваш внутренний запрос не ограничивается типом_материала и годами.

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, который должен нормально работать для очень больших данных.*

0 голосов
/ 14 февраля 2019

Это должно быть решено с помощью оконных функций, а не рекурсии или подзапросов:

SELECT
  type_material, years, row_num, percentual_price
  SUM (percentual_price) OVER (PARTITION BY type_material, years ORDER BY row_num) cumulative
FROM @mytable
...