【问题标题】:Within each row group, compare date field based on another field在每个行组中,根据另一个字段比较日期字段
【发布时间】:2016-09-13 22:09:52
【问题描述】:

对于每个 OrderID,需要检查 PartID-A 的 DueDate 是否比 PartID-B 早。

行分组 看来OVER(PARTITION) 可用于比较所有具有相同OrderID 的行。不幸的是,到目前为止,甚至没有一点成功。

字段比较 不确定 self-join 是否用于根据另一个字段 (PartID) 比较一个字段 (DueDate)。语法似乎不允许这种用法。

使用 SQL 2012

此查询提取数据但不分组也不进行日期比较。

SELECT 
    SALES_DOC_NUM AS [OrderID]
    --, MAX(SALES_DOC_NUM) OVER(PARTITION BY SALES_DOC_NUM)
    , RTRIM(SHIP_TO_ADDRESS_CODE) AS [ShipToID]
    , ITEM_NUMBER AS [PartID]
    , CONVERT(VARCHAR(17), REQ_SHIP_DATE, 110) AS [DueDate]

FROM SPV3SALESLINEITEM

WHERE (ITEM_NUMBER = '1RC-AM' 
        OR ITEM_NUMBER = '1RC-DCR')

    GROUP BY SALES_DOC_NUM, ITEM_NUMBER, SHIP_TO_ADDRESS_CODE, REQ_SHIP_DATE

    ORDER BY SALES_DOC_NUM;

来自查询的表数据。

OrderID        ShipToID    PartID    DueDate  
SO003590       1614        DR        04-11-2016  
SO003591       0532        AM        02-25-2016  
SO003591       0532        DR        05-16-2016  
SO003592       0812        AM        02-15-2016  
SO003592       0812        DR        04-25-2016  
SO003593       2216        AM        04-11-2016  
SO003593       2216        AM        09-12-2016  
SO003593       2216        DR        04-11-2016  
SO003594       1411        AM        02-11-2016  
SO003594       1411        DR        03-21-2016  
SO003596       1065        AM        02-04-2016  
SO003596       1065        DR        06-06-2016  
SO003597       0504        AM        02-04-2016  
SO003597       0504        DR        06-06-2016  

【问题讨论】:

  • 您的示例数据和问题不适合我。为什么PartId 列中没有名为“A”或“B”的值?你想要什么结果?
  • 嘿@GordonLinoff 为不匹配的混乱感到抱歉。 A 部分是“AM”,B 部分是“DR”。

标签: sql sql-server sql-server-2012


【解决方案1】:

让我做以下假设:

  • 您希望所有订单都是PartId“A”的DueDate 晚于PartId“B”。
  • 给定订单最多有一个“A”和“B”。
  • 您需要发生这种情况的订单。

您可以使用条件聚合来做到这一点:

select sales_doc_num,
       max(case when partid = 'A' then duedate end) as a_duedate,
       max(case when partid = 'B' then duedate end) as b_duedate
from SPV3SALESLINEITEM si
group by sales_doc_num
having max(case when partid = 'A' then duedate end) > max(case when partid = 'B' then duedate end);

我不太确定这如何与帖子中的查询相匹配,而帖子中的其他列和条件不在问题中。

【讨论】:

  • 那是完美的@gordonlinoff。旨在删除与该特定问题无关的陈述部分。感谢您在他们周围工作。现在看看 case 语句如何返回另一个字段并有条件地比较它们。我的大脑谢谢你。
猜你喜欢
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 2018-11-05
  • 2015-12-21
  • 2016-06-17
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多