首页 > 解决方案 > 在 SQL 中转换表时,如何应用类似于“if 语句”的自定义逻辑?

问题描述

我正在尝试根据一些自定义逻辑转换我的数据。鉴于我是 SQL 新手,我对如何解决这个问题有点迷茫。真的可以在从哪里开始使用一些帮助,我对连接很满意,但这个问题的答案似乎并不直观。我知道该解决方案将涉及使用 case when 语句(对于下面的第二个标准块?)并在第一个语句块上进行内部连接,但仍然有点困惑。

我正在向我的交易数据中添加一个名为“difference_in_rate”的新列,它是 a.rate 和 b.adjusted_rate 之间的差异。有一种非常微妙的计算方法,请参见下图的示例表:

[![在此处输入图像描述][1]][1]

我需要应用这样的逻辑:

  1. 检查事务是否在助手表的开始日期和结束日期之间
  2. 检查 txn 的 product_id 是否与助手表的 product_id 匹配
  3. 检查 txn 的增长是否与辅助表的增长相匹配

一旦这些检查到位:

  1. 如果事务代码 = REX,则应用与段 1 关联的费率
  2. 如果事务代码!= REX,则检查持续时间是否 >= 10,如果是,则应用分段 2 费率

使用此逻辑,事务#1 将链接到记录#1,事务#2 将链接到记录#4,并且适当的减去值将插入事务表的最后一列。谢谢,如果我只是在说胡言乱语,需要澄清一下,请告诉我,这是第一次在这里发帖!

标签: sqlsql-server-2008joinlogiccase

解决方案


您需要将您的逻辑表达为JOIN条件,使用 aLEFT JOIN以防没有可用的调整,然后COALESCE将其设置adjusted_rate为 0 不存在:

SELECT a.*, a.rate - COALESCE(b.adjusted_rate, 0) AS difference_in_rate
FROM tablea a
LEFT JOIN tableb b ON a.Date_of_txn BETWEEN b.Start_date and b.End_date
                  AND b.Product_ID = a.Product_ID
                  AND b.Growth = a.Growth
                  AND b.Segment = CASE WHEN a.Code = 'REX' THEN 1
                                       WHEN a.duration >= 10 THEN 2
                                       ELSE 3
                                  END

输出

Transaction #   Product_ID  Growth  Code    Duration    Date_of_txn             rate    difference_in_rate
1               ABC123      High    REX     12          01/01/2018 00:00:00     0.05    -0.03
2               DEF123      Medium  REI     7           12/01/2018 00:00:00     0.06    0.02

dbfiddle 上的演示


推荐阅读