1

私は通貨で分類された為替レートのリストを持っています。例えばSQLストアドプロシージャ - 日付とif文で区別しようとしています

  • GBP USDへ|キャプチャの日付:23/02/12 |値:5
  • GBPからUSD |キャプチャの日付:22/02/12 |値:3
  • GBPからUSD |キャプチャの日付: 21/02/12 |値:3

私は何が起こりたいですか。クエリが実行されると、それは取った最新の日付を自動的に計算し、前の日付をとったときにこれを比較して、これが増えたかどうかを示す値をポストバックします。 、同じ場合 "< - >"

私の現在のクエリは、取得した最新の日付を引き出​​すことができますが、2番目の最新の日付と値を取り出してifステートメントを投稿するためにサブクエリを実行する必要があります。

私の方法で正しい木を吠えるのですか?

ここに私のコードです。

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 

いくつかのサンプルデータ:また

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 
+0

簡単に言うと、はい。最新の値を取得して同じソースに戻って、最大の日付!=最新の値の日付に戻ってください。あるいは、再帰的にすべてのペアを見つけ出し、最後のペアを取ることができます。各テーブルのサンプルデータ、またはそれぞれのテーブルの定義を持つと便利です。 – Sorpigal

+0

ええ、大丈夫です。最初の投稿でサンプルデータを編集しましたが、返信ボックスで明確に表示できません。 – Rexxo

答えて

1

、あなたがあなたの前の質問への受け入れ答えのバリエーションを試みることができる:

select source_currency_code, 
     target_currency_code, 
     max(source_currency_name) source_currency_name, 
     max(target_currency_name) target_currency_name, 
     max(case when rn = 1 then value_amount end) value_amount, 
     max(case when rn = 1 then uplift end) uplift, 
     max(case when rn = 1 then date_loaded end) date_loaded, 
     case sign(max(case when rn = 1 then value_amount end) - 
       max(case when rn = 2 then value_amount end)) 
      when 1 then '^' 
      when 0 then '<->' 
      when -1 then 'v' 
     end change_over_previous 
from 
(select t.source_currency_code, 
     t.target_currency_code, 
     '('+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, 
     rank() over (partition by t.source_currency_code, 
            t.target_currency_code 
        order by t.date_loaded desc) rn 
from texchange_rate t 
join tcurrency s on s.currency_code = t.source_currency_code 
join tcurrency x on x.currency_code = t.target_currency_code) v 
where rn in (1, 2) 
group by source_currency_code, target_currency_code 
order by source_currency_code, target_currency_code 
+0

あなたは、天才です。あなたはどうやってこれでいいですか? 私はあなたのメソッドに戻っていましたが、私が試みていた解決策は、別々のフィールドを持つ新しいテーブルに結果をポストすることでした。 もう一度、ありがとうございます! – Rexxo

+0

シャック!お役に立てて嬉しいです。 :) –

1
;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 

持っている必要はありませんWHERE a.RowNum = 1これを指定しないと、その前の値を持つすべてのレコードが返されます。

関連する問題