Bei mir tut ärgern, dass es keine Multiply/Produktaggregatfunktion in SQL Server. Leider habe ich oben die Antwort @gbn nicht gefunden, bis ich das Problem schon anders gelöst hatte. Ich poste diese alternative Lösung für den Fall, dass es irgendjemandem hilft oder wenn es sich als effizienter herausstellt.
Meine Lösung beinhaltet grundsätzlich die Verwendung eines rekursiven allgemeinen Tabellenausdrucks, um alle Werte zu multiplizieren.
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
Ausgangstabelle (+ die partitionierte Zeilennummer) auswählt:
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
Liste der ID/all Multiplizierern zusammen auswählt:
ID multiplier Iteration
1 1.80000 2
2 1.70000 1
3 1.00000 1
4 0.40000 4
Warum CASE WHEN Wert <1? sollte es nicht <0 sein? – zvolkov
@zvolkov: Ja, sollte es. Die Beispieldaten haben keine Werte> 0 und <1, so dass diese Bedingung nicht erfüllt wurde. Vielen Dank – gbn