1

区分我有货币分类汇率的名单,我需要以某种方式发布的关于价值的差异。SQL存储过程 - 试图通过日期和if语句

例如:

  • GBP USD至|截获日期:23/02/12 |值:5
  • GBP USD至|截获日期:22/02/12 |值:3
  • GBP USD至|截获日期: 21/02/12 |值:3

我希望发生什么;当查询运行时,它会自动计算出最新的日期,比较这一点,当前一个日期采取,并回传一个值,说如果这已经增加,即如果增加然后“^”,如果减少“v” ,如果相同“< - >”。

我目前的查询可以提取最新的日期,但我仍然需要做一个子查询来取出第二个最新的日期和值,然后发布一个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 2012-02-24 11:53:01

+0

嗯没关系。我在我的初始文章中编辑了一些示例数据,因为我无法在答复框中清楚地做到这一点。 – Rexxo 2012-02-24 12:10:28

回答

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 2012-02-24 14:40:55

+0

Shucks!很高兴我能帮上忙。 :) – 2012-02-24 14:53:30

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,如果没有它,它只会返回其前一个值旁边的所有记录。