2016-09-13 66 views
1

对于每个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 
+0

您的示例数据和问题不适合我。为什么在“PartId”列中没有称为“A”或“B”的值?你想要什么结果? –

+0

嘿@GordonLinoff sry的错配混乱。部分A是“AM”,部分B是“DR”。 –

回答

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); 

我不太清楚如何适应在其中具有其他列的条件没有问题的发布查询。

+1

这是完美的@gordonlinoff。意味着删除与该特定问题无关的声明部分。感谢你在他们周围工作。 现在看到case语句如何返回另一个字段并有条件地比较它们。我的大脑感谢你。 –