在每个行组中,根据另一个字段比较日期字段

时间:2016-09-13 22:09:53

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

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

行分组可以使用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  

1 个答案:

答案 0 :(得分:1)

让我做出以下假设:

  • 您希望所有订单都是PartId" A"比DueDate" B"。
  • PartId
  • 最多只有一个" 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);

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