【问题标题】:Filtering data set on first where clause then filtering left over data set on 2nd where clause在第一个 where 子句上过滤数据集,然后在第二个 where 子句上过滤剩余的数据集
【发布时间】:2021-07-31 05:20:47
【问题描述】:

我有一张包含订单商品和订单日期的表格。

我想提取所有订单日期在 2020 年的记录,但是如果该商品在 2020 年没有任何订单,那么我想提取该订单的所有记录

所以如果一件商品在 2020 年有订单,那么只有 2020 年的记录 如果 2020 年没有订单,那么所有其他记录

OrderItem   Order Date
----------------------
A           4/21/2020
A           7/22/2020
A           5/15/2019
B           2/20/2019

预期输出

OrderItem   Order Date
----------------------
A           4/21/2020
A           7/22/2020
B           2/20/2019

【问题讨论】:

  • 请显示您目前拥有的代码,以便我们了解如何将其用于您现有的查询。我假设您也有一个Item 表,请同时显示
  • @Charlieface 我有一个相当复杂的查询,最终返回我在 CTE 或 Temp 表中的这两列。由于安全原因,我可能无法分享这些内容。但是,您可以认为这些只是需要处理的 2 列。如果这有助于清晰,我已经添加了预期的输出

标签: sql sql-server tsql join


【解决方案1】:

你可以使用not exists:

select o.*
from orders o
where (o.orderdate >= '2020-01-01' and o.orderdate < '2021-01-01') or
      not exists (select 1
                  from orders o2
                  where o2.orderitem = o.orderitem and
                        o2.orderdate >= '2020-01-01' and
                        o2.orderdate < '2021-01-01'
                 );

如果“订单”确实是一个复杂的查询,您可能会发现窗口函数是更好的选择:

select o.*
from (select o.*,
             count(case when o.orderdate >= '2020-01-01' and o.orderdate < '2021-01-01' then 1 else 0 end) over (partition by orderitem) as cnt_2020
      from orders o
     ) o
where cnt_2020 = 0 or
      o.orderdate >= '2020-01-01' and o.orderdate < '2021-01-01';

这只会引用一次“复杂查询”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2015-02-09
    • 2020-12-17
    相关资源
    最近更新 更多