sql - 在 SQL 中转换表时,如何应用类似于“if 语句”的自定义逻辑?
问题描述
我正在尝试根据一些自定义逻辑转换我的数据。鉴于我是 SQL 新手,我对如何解决这个问题有点迷茫。真的可以在从哪里开始使用一些帮助,我对连接很满意,但这个问题的答案似乎并不直观。我知道该解决方案将涉及使用 case when 语句(对于下面的第二个标准块?)并在第一个语句块上进行内部连接,但仍然有点困惑。
我正在向我的交易数据中添加一个名为“difference_in_rate”的新列,它是 a.rate 和 b.adjusted_rate 之间的差异。有一种非常微妙的计算方法,请参见下图的示例表:
[![在此处输入图像描述][1]][1]
我需要应用这样的逻辑:
- 检查事务是否在助手表的开始日期和结束日期之间
- 检查 txn 的 product_id 是否与助手表的 product_id 匹配
- 检查 txn 的增长是否与辅助表的增长相匹配
一旦这些检查到位:
- 如果事务代码 = REX,则应用与段 1 关联的费率
- 如果事务代码!= REX,则检查持续时间是否 >= 10,如果是,则应用分段 2 费率
使用此逻辑,事务#1 将链接到记录#1,事务#2 将链接到记录#4,并且适当的减去值将插入事务表的最后一列。谢谢,如果我只是在说胡言乱语,需要澄清一下,请告诉我,这是第一次在这里发帖!
解决方案
您需要将您的逻辑表达为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
推荐阅读
- php - 站点 一些页面重定向到 Https Magento 2
- vue.js - CoreUI 的 CInput 忽略的插槽
- java - JSON到XML与java中的类型属性
- c - 从C中的文件流中获取列数据
- python - 简单定义的值错误以生成颜色列表
- python - Python Django URL 呈现不正确的模板
- docker - 如果使用 sam local invoke 调用函数,则在执行 axios.request 时 localhost 的 IP 是什么?
- .net - MSTest V2 适配器不支持 testsettings 文件或 vsmdi 文件
- anychart - 自定义时间轴的工具提示以一起显示原始值和对象
- oracle - 为什么存储过程阶段在 CLI 上运行良好时出错?