我在尝试将 CASE WHEN 用于以下场景时遇到问题:
我有一个超过 3 列的表格,但只有这 3 列是相关的:order_number、payment_method、order_date。
每个 order_number 可以有多个“订单”。永远不会有两个相同的 order_date
订单号 | 付款方式 | 订单日期 |
---|---|---|
120 | 现金 | 01/01/2021 |
175 | 信用卡 | 01/02/2021 |
209 | 现金 | 01/03/2021 |
209 | 信用卡 | 01/04/2021 |
209 | 个人支票 | 01/05/2021 |
209 | 信用卡 | 01/06/2021 |
209 | 现金 | 01/07/2021 |
209 | 个人支票 | 01/08/2021 |
277 | 信用卡 | 01/09/2021 |
301 | 现金 | 01/10/2021 |
333 | 个人支票 | 01/11/2021 |
333 | 现金 | 01/12/2021 |
333 | 现金 | 01/13/2021 |
333 | 个人支票 | 01/14/2021 |
400 | 信用卡 | 01/15/2021 |
551 | 信用卡 | 01/16/2021 |
551 | 现金 | 01/17/2021 |
680 | 个人支票 | 01/18/2021 |
我正在尝试合并它,以便我的列表每个订单号只有 1 行,基于以下逻辑:
目标如下:
订单号 | 付款方式 | 订单日期 |
---|---|---|
120 | 现金 | 01/01/2021 |
175 | 信用卡 | 01/02/2021 |
209 | 信用卡 | 01/06/2021 |
277 | 信用卡 | 01/09/2021 |
301 | 现金 | 01/10/2021 |
333 | 个人支票 | 01/14/2021 |
400 | 信用卡 | 01/15/2021 |
551 | 信用卡 | 01/16/2021 |
680 | 个人支票 | 01/18/2021 |
没有重复的订单号,当有重复的订单号时,遵循逻辑并拉出该行。
我尝试了 CASE WHEN 的各种方法,但在 THEN 部分应用条件时总是失败。
答案 0 :(得分:0)
也许这样的事情会奏效:
SELECT o.order_number, MAX(COALESCE(tc.latest_cc_tran, o.order_date)) AS latest_date
FROM order o
OUTER APPLY(
SELECT MAX(ot.tran_date) latest_cc_tran
FROM order_tran ot
WHERE ot.order_number = o.order_number
) tc
GROUP BY o.order_number
注意:我没有测试查询,但它应该传达了要点。
答案 1 :(得分:0)
作为一般方法,您可以使用 row_number()
:
select o.*
from (select o.*,
row_number() over (partition by order_number
order by (case when payment_method = 'Credit Card' then 1 else 2 end),
order_date desc
) as seqnum
from orders o
) o
where seqnum = 1;
这是通用 SQL,应该适用于任何数据库。但是,根据您的数据库,可能会有快捷方式。