Меня раздражает, что в SQL-сервере нет функции умножения / агрегирования продуктов.К сожалению, я не нашел ответ, который @gbn дал выше, пока я уже не решил проблему другим способом.Я публикую это альтернативное решение на тот случай, если оно кому-нибудь поможет или окажется более эффективным.
Мое решение в основном заключается в использовании рекурсивного общего табличного выражения для умножения всех значений вместе.
DECLARE @t TABLE (PID INT, ID INT, multiplier DECIMAL(14,5))
INSERT @t
(PID, ID, multiplier)
VALUES (1, 1, 1.5 )
, (2, 1, 1.2)
, (3, 2, 1.7)
, (4, 3, 1)
, (5, 4, 0.8)
, (6, 4, 0.5)
, (7, 4, 2)
, (8, 4, 0.5)
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY PID )
FROM @t;
WITH
trn AS
(
SELECT PID, ID, multiplier, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY PID ) AS rn
FROM @t
),
tmu AS
(
SELECT DISTINCT
ID,
trn.multiplier AS multiplier,
1 AS Iteration
FROM trn WHERE rn = 1
UNION ALL
SELECT
trn.ID, CAST(tmu.multiplier * trn.multiplier AS DECIMAL(14,5)) AS multiplier
, tmu.Iteration + 1 AS Iteration
FROM
tmu --AS tmu1
JOIN trn ON tmu.ID = trn.ID AND tmu.Iteration + 1 = trn.rn
),
mxi AS
(
SELECT ID, COUNT(ID) AS Iter
FROM trn
GROUP BY ID
)
SELECT tmu.*
FROM tmu
JOIN mxi ON mxi.ID = tmu.ID AND mxi.Iter = tmu.Iteration
ORDER BY ID
Начальная таблица (+ номер разделенной строки) выбирает:
PID ID Multiplier rn
1 1 1.50000 1
2 1 1.20000 2
3 2 1.70000 1
4 3 1.00000 1
5 4 0.80000 1
6 4 0.50000 2
7 4 2.00000 3
8 4 0.50000 4
Список идентификаторов / множителей, умноженных вместе, выбирает:
ID multiplier Iteration
1 1.80000 2
2 1.70000 1
3 1.00000 1
4 0.40000 4