2017-06-01 8 views
-1

Auf dieser Website habe ich eine Funktion, die ich mit postgresql verwenden möchten:Funktion für Postgresql

https://raresql.com/2013/05/16/sql-server-excel-financial-functions-pmt/

Hier ist die Abfrage:

CREATE FUNCTION UDF_PMT 
(@InterestRate NUMERIC(18,8), --Rate is the interest rate per period. 
@Nper   INT,   --Nper is the total number of payment 
           --periods in an annuity. 
@Pv   NUMERIC(18,4), --Pv is the present value, or the 
           --lump-sum amount that a series of 
           --future payments is worth right now. 
           --If pv is omitted, it is assumed to be 
           --0 (zero). PV must be entered as a 
           --negative number. 
@Fv   NUMERIC(18,4), --Fv is the future value, or the 
           --lump-sum amount that a series of 
           --future payments is worth right now. 
           --If pv is omitted, it is assumed to 
           --be 0 (zero). PV must be entered as a 
           --negative number. 
@Type   BIT   --Type is the number 0 or 1 and 
           --indicates when payments are due. 
           --If type is omitted, it is assumed 
           --to be 0 which represents at the end 
           --of the period. 
           --If payments are due at the beginning 
           --of the period, type should be 1. 
) 
RETURNS NUMERIC(18,2) --float 
AS 
    BEGIN 
    DECLARE @Value NUMERIC(18,2) 
    SELECT @Value = Case 
    WHEN @Type=0 
    THEN Convert(float,@InterestRate/100) 
    /(Power(Convert(float,(1 + @InterestRate/100)),@Nper)-1) 
    * -(@Pv*Power(Convert(float,(1 + @InterestRate/100)),@Nper) 
    [email protected]) 

    WHEN @Type=1 
    THEN Convert(float,@InterestRate/100)/
    (Power(Convert(float,(1 + @InterestRate/100)),@Nper)-1) 
    * -(@Pv*Power(Convert(float,(1 + @InterestRate/100)),@Nper) 
    [email protected]) 
    /(1 + Convert(float,(@InterestRate/100))) 

    END 
    RETURN @Value 
    END 

ich die Variablen umbenannt ohne @ und änderte den Körper ein wenig, aber irgendwie kann ich es nicht richtig laufen lassen.

Ist es möglich, diese Abfrage für postgresql neu zu schreiben? Hast du Ideen, wie es geht? Danke

+0

Das Wichtige hier ist Ihr gewünschtes Ergebnis und ein Beispieldaten. Kannst du etwas zeigen? –

+0

@reds Hallo danke für deine Hilfe! Zum Beispiel würde 'SELECT UDF_PMT (0.625,24,5000,0,0)' '225' zurückgeben. –

+0

Einige Ausgaben sind auch in der Post zu sehen: https://raresql.com/2013/05/16/sql- Server-Excel-Finanz-Funktionen-PMT/@reds Danke –

Antwort

1
CREATE OR REPLACE FUNCTION UDF_PMT (
InterestRate NUMERIC(18,8), 
Nper   INTEGER, 
Pv   NUMERIC(18,4), 
Fv   NUMERIC(18,4), 
Typ   INTEGER 
) 
RETURNS NUMERIC(18,2) 
AS $$ 
    SELECT round(
     CASE 
     WHEN Typ = 0 THEN 
      (InterestRate/100)/
      (Power(1 + InterestRate/100, Nper) - 1) * 
      (Pv * Power(1 + InterestRate/100, Nper) + Fv) 
     WHEN Typ = 1 THEN 
      (InterestRate/100)/
      (Power(1 + InterestRate/100, Nper) - 1) * 
      (Pv * Power(1 + InterestRate/100, Nper) + Fv)/
      (1 + InterestRate/100) 
     END, 2) 
$$ LANGUAGE SQL;