Rekursion in Statement

03/12/2009 - 13:27 von Jan Waiz | Report spam
Hi All,

um das eigentliche Problem darzustellen, folgende Ausgangssituation:

Customers
CustID Name Price
-
1 Mueller 100,00
2 Meyer 200,00
3 Schulz 50,00

Ratios
CustID RatioID Year Ratio
1 9 2009 1,00
1 10 2010 2,00
1 11 2011 3,00
2 12 2009 5,00
2 13 2010 6,00
2 14 2011 7,00
3 15 2009 2,00
3 16 2010 2,00
3 17 2011 6,00

Ein Select mit entsprechendem Join führt erwartungskonform zu folgenden
Ergebnis:

CustID RatioID Year Ratio Price
1 9 2009 1,00 100,00
1 10 2010 2,00 100,00
1 11 2011 3,00 100,00
2 12 2009 4,00 200,00
2 13 2010 5,00 200,00
2 14 2011 6,00 200,00
3 15 2009 2,00 50,00
3 16 2010 4,00 50,00
3 17 2011 6,00 50,00

Jetzt zu dem Problem. Benötigt wird eine weitere berechnete Spalte, die auf
Basis des Ratio und des Preises den neuen Preis berechnet - aber nicht (!)
auf dem Ausgangspreis, sondern bezogen auf das jeweilige Vorjahr, wenn
vorhanden! Die Ergebnismenge müßte somit SO aussehen:

CustID RatioID Year Ratio Price Calculated
1 9 2009 1,00 100,00 99,00
=> Ausgangspreis 100 minus 1 %
1 10 2010 2,00 100,00 97,02
=> Berechneter Preis von 2009 minus 2%
1 11 2011 3,00 100,00 94,11
=> Berechneter Preis von 2010 minus 3%
2 12 2009 4,00 200,00 192,00
=> Ausgangspreis 200 minus 4%
2 13 2010 5,00 200,00 182,40
=> Berechneter Preis von 2009 minus 5%
2 14 2011 6,00 200,00 171,46
=> Berechneter Preis von 2010 minus 6%
3 15 2009 2,00 50,00 49,00
=> Ausgangspreis 50 minus 2%
3 16 2010 4,00 50,00 47,04
=> Berechneter Preis von 2009 minus 4%
3 17 2011 6,00 50,00 44,22
=> Berechneter Preis von 2010 minus 6%

Zurück gegeben werden muß eine Ergebnismenge wie oben gezeigt - egal wie
diese zustande kommt. Laufzeit/Perfomance spielt auch erst einmal keine
Rolle. Hautpsache es funzt :-)

Ich will jetzt garnicht erzàhlen, was ich schon alles versucht habe - ich
brauche eine Lösung... Und die ist wahrscheinlich wieder SO simpel, das ich
mir selber im Wege stehe... *seufz*

Vielen Dank im Vorraus!
 

Lesen sie die antworten

#1 Stefan Hoffmann
03/12/2009 - 14:15 | Warnen spam
hallo Jan,

Jan Waiz wrote:
Jetzt zu dem Problem. Benötigt wird eine weitere berechnete Spalte, die
auf Basis des Ratio und des Preises den neuen Preis berechnet - aber
nicht (!) auf dem Ausgangspreis, sondern bezogen auf das jeweilige
Vorjahr, wenn vorhanden! Die Ergebnismenge müßte somit SO aussehen:

Ich will jetzt garnicht erzàhlen, was ich schon alles versucht habe -
ich brauche eine Lösung... Und die ist wahrscheinlich wieder SO simpel,
das ich mir selber im Wege stehe... *seufz*


Simple? Na ja, zumindest einfach zu verstehen:

USE [tempdb] ;
GO

CREATE TABLE [Customer]
(
[CustID] INT NOT NULL,
[Name] NVARCHAR(255) NOT NULL,
[Price] MONEY NOT NULL
) ;
GO

CREATE TABLE [Ratio]
(
[CustID] INT NOT NULL,
[RatioID] INT NOT NULL,
[Year] INT NOT NULL,
[Ratio] MONEY NOT NULL
) ;
GO

CREATE FUNCTION [fn_Ratio] ( @CustID INT, @Year INT )
RETURNS MONEY
AS BEGIN
DECLARE @Result MONEY = 1.00 ;
SELECT @Result = @Result * ( 100.00 - [Ratio] ) / 100.00
FROM [Ratio]
WHERE [CustID] = @CustID
AND [Year] <= @Year ;
RETURN @Result ;
END ;
GO

INSERT INTO [Customer]
(
[CustID],
[Name],
[Price]
)
VALUES ( 1, 'Mueller', 100.00 ),
( 2, 'Meyer', 200.00 ),
( 3, 'Schulz', 50.00 ) ;

INSERT INTO [Ratio]
(
[CustID],
[RatioID],
[Year],
[Ratio]
)
VALUES ( 1, 9, 2009, 1.00 ),
( 1, 10, 2010, 2.00 ),
( 1, 11, 2011, 3.00 ),
( 2, 12, 2009, 5.00 ),
( 2, 13, 2010, 6.00 ),
( 2, 14, 2011, 7.00 ),
( 3, 15, 2009, 2.00 ),
( 3, 16, 2010, 2.00 ),
( 3, 17, 2011, 6.00 ) ;

SELECT C.*,
R.*,
C.[Price] *
[dbo].[fn_Ratio](C.[CustID], R.[Year]) AS [CalculatedPrice]
FROM [Customer] C
INNER JOIN [Ratio] R ON R.[CustID] = C.[CustID] ;
GO

DROP TABLE [Customer] ;
DROP TABLE [Ratio] ;
DROP FUNCTION [fn_Ratio] ;
GO


mfG

Access-FAQ http://www.donkarl.com/
KnowHow.mdb http://www.freeaccess.de
Newbie-Info http://www.doerbandt.de/Access/Newbie.htm

Ähnliche fragen