SQL Stored Proc – Versuch, nach Datum und if-Anweisung zu unterscheiden
-
12-11-2019 - |
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
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.