Frage

Ich habe eine nach Währung kategorisierte Liste mit Wechselkursen, auf der ich die Wertdifferenz irgendwie vermerken muss.

Zum Beispiel:

  • GBP zu USD | Datum der Erfassung:23/02/12 | Wert:5
  • GBP zu USD | Datum der Erfassung:22/02/12 | Wert:3
  • GBP zu USD | Datum der Erfassung:21/02/12 | Wert:3

Was ich möchte, ist;Wenn die Abfrage ausgeführt wird, ermittelt sie automatisch das letzte erfasste Datum, vergleicht es mit dem vorherigen erfassten Datum und sendet einen Wert zurück, um anzugeben, ob dieses Datum erhöht wurde, d. h.wenn erhöhen, dann „^“, wenn verringern „v“, wenn gleich „<->“.

Meine aktuelle Abfrage kann das letzte erfasste Datum abrufen, ich muss jedoch noch eine Unterabfrage durchführen, um das zweitletzte Datum und den zweitletzten Wert abzurufen, und dann eine if-Anweisung posten.

Bin ich mit meiner Methode auf dem richtigen Weg?

Hier ist mein Code.

SELECT
distinct t.source_currency_code, t.target_currency_code,
t.entry_no as entry_no,
'(' + t.source_currency_code + ') '  + s.currency_name as source_currency_name, 
'(' + t.target_currency_code + ') '  + x.currency_name as target_currency_name,
t.value_amount as value_amount,
t.uplift_percent as uplift,
t.date_loaded as date_loaded

from texchange_rate t, tcurrency s, tcurrency x

where 
s.currency_code = t.source_currency_code and 
x.currency_code = t.target_currency_code and
t.date_loaded in 
      (
          SELECT max(date_loaded) from texchange_rate tt
          where t.source_currency_code = tt.source_currency_code 
          and t.target_currency_code = tt.target_currency_code
      )

order by source_currency_code, target_currency_code


SELECT
distinct t.source_currency_code, t.target_currency_code,
t.entry_no as entry_no,
'(' + t.source_currency_code + ') '  + s.currency_name as source_currency_name, 
'(' + t.target_currency_code + ') '  + x.currency_name as target_currency_name,
t.value_amount as value_amount,
t.uplift_percent as uplift,
t.date_loaded as date_loaded2

from texchange_rate t, tcurrency s, tcurrency x

where 
s.currency_code = t.source_currency_code and 
x.currency_code = t.target_currency_code and
t.date_loaded in 
       (
          SELECT max(date_loaded) from texchange_rate tt
          where t.source_currency_code = tt.source_currency_code
          and t.target_currency_code = tt.target_currency_code
      )
    and
      t.value_amount in 
      (
          SELECT value_amount from texchange_rate tt
          where DATEDIFF(day, date_loaded, getdate()) < date_loaded
            and t.source_currency_code = tt.source_currency_code
            and t.target_currency_code = tt.target_currency_code
      )

order by source_currency_code, target_currency_code

Einige Beispieldaten:

4366    GBP USD 15986   23/01/2012 13:42:02
4337    GBP USD 15600   17/10/2011 12:37:58
4312    GBP USD 15500   22/08/2011 14:00:01
4287    GBP USD 15500   21/08/2011 14:00:01
War es hilfreich?

Lösung

Alternativ können Sie eine Variation der akzeptierten Antwort auf Ihre vorherige Frage versuchen: generasacodicetagpre.

Andere Tipps

;WITH ExchangeCTE AS
(   SELECT  *, ROW_NUMBER() OVER(PARTITION BY source_currency_code, target_currency_code ORDER BY date_loaded DESC) [RowNum]
    FROM    texchange_rate
)
SELECT  a.source_currency_code, 
        a.target_currency_code,
        a.entry_no AS entry_no,
        '(' + a.source_currency_code + ') '  + s.currency_name AS source_currency_name, 
        '(' + a.target_currency_code + ') '  + t.currency_name AS target_currency_name,
        a.value_amount AS value_amount,
        a.uplift_percent AS uplift,
        a.date_loaded AS date_loaded2,
        b.value_amount AS Previous_Value_Amount,
        CASE WHEN a.value_amount > b.value_amount THEN '^'
            WHEN a.value_amount = b.value_amount THEN '<->'
            ELSE 'v'
        END AS [Symbol]
FROM    ExchangeCTE a
        INNER JOIN ExchangeCTE b
            ON a.source_currency_code = b.source_currency_code 
            AND a.target_currency_code = b.target_currency_code
            AND a.RowNum = b.RowNum - 1 -- PREVIOUS RECORD
        INNER JOIN tcurrency s
            ON a.source_currency_code = S.currency_code 
        INNER JOIN tcurrency t
            ON a.target_currency_code = S.currency_code  
WHERE   a.RowNum = 1 -- LATEST RECORD

Es ist nicht notwendig, das zu haben WHERE a.RowNum = 1, Ohne dies werden einfach alle Datensätze mit ihrem vorherigen Wert daneben zurückgegeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top