SQL 多条件 CASE WHEN 问题

时间:2021-04-01 21:14:18

标签: sql database case-when

我在尝试将 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 行,基于以下逻辑:

  1. 如果只有 1 个订单号 - 返回订单日期
  2. 如果有 >1 个相同的订单号并且其中任何订单是使用信用卡支付的 - 返回使用信用卡支付的最近订单日期
  3. 如果有 >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 部分应用条件时总是失败。

2 个答案:

答案 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,应该适用于任何数据库。但是,根据您的数据库,可能会有快捷方式。