首页 > 解决方案 > 如何通过比较 2 个不同的日期列来删除基于 1 列的重复 SQL 行?

问题描述

我有一个查询,它连接多个表/视图并显示由名为 VIN 的列标识的行。如果两个日期都有一个值,我只想根据 2 个不同日期字段(打开日期和发票日期)的最近日期显示一次 VIN。

如果 Invoice Date 为 Null,则显示具有该 VIN 的最近 Open Date 的行。例如,如果我有 3 行 VIN='XY123456' 和

第 1 行显示打开日期 2019 年 3 月 1 日和发票日期 NULL,以及

第 2 行显示打开日期 2019 年 3 月 15 日和发票日期 2019 年 3 月 28 日,以及

第 3 行显示打开日期 4/1/2019 和发票日期 4/5/2019,

我想返回第 1 行,因为 Invoice Date 为 NULL,并且它是该 VIN 的最近 Open Date。

如果第 1 行有发票日期,我们将返回任一日期列中最近日期的行。

我试过 ELSE 子句和 COALASCE 没有成功。我还尝试做一个子查询来使用 MAXDATE。

SELECT RO.[RepairOrderID]
      ,RO.[CompanyName]
      ,CUS.CustomerKey
      ,UN.UnitNumber AS 'UNIT #'
      ,ISNULL(UC.[Tag #],'') AS 'S #'
      ,UN.Year
      ,UN.Make
      ,UN.Model
      ,UN.VIN
      ,ROS.[RepairOrderStatus] AS 'STATUS'
      ,RO.RepairOrderNumber AS 'RO #'
      ,CONVERT(VARCHAR(2),DATEPART(month, RO.[OpenDate])) 
       + '/'+ CONVERT(VARCHAR(2),DATEPART(DAY, RO.[OpenDate])) 
       + '/' + CONVERT(VARCHAR(4),DATEPART(YEAR, RO.[OpenDate])) 
         'OPEN DATE'
     ,CONVERT(VARCHAR(2),DATEPART(month, ROI.InvoiceDate)) 
       + '/'+ CONVERT(VARCHAR(2),DATEPART(DAY, ROI.InvoiceDate)) 
       + '/' + CONVERT(VARCHAR(4),DATEPART(YEAR, ROI.InvoiceDate)) 
         'INVOICE DATE'
  FROM [ProfitMaster].[dbo].[RepairOrder] RO with (nolock)
  INNER JOIN [ProfitMaster].[dbo].[vwAC_SSR_Customer] CUS with (nolock)
  ON CUS.CustomerID = RO.CustomerID
  INNER JOIN [ProfitMaster].[dbo].[RepairOrderStatus] ROS with (nolock)
  ON ROS.RepairOrderStatusID = RO.RepairOrderStatusID
  LEFT OUTER JOIN [ProfitMaster].[dbo].[RepairOrderInvoice] ROI with (nolock)
  ON ROI.RepairOrderID = RO.RepairOrderID
  LEFT OUTER JOIN [ProfitMaster].[dbo].[vwSR_SSR_Unit] UN with (nolock)
  ON UN.UnitInventoryID = RO.UnitInventoryID
  LEFT OUTER JOIN [ProfitMaster].[dbo].[vwSR_SSR_UnitCharacteristics] UC with (nolock)
  ON UC.UnitInventoryID = Ro.UnitInventoryID
  WHERE ((ROS.RepairOrderStatus IN ('OPEN')
  OR (ROS.RepairOrderStatus = 'QUOTE' AND RO.OpenDate >= (getDate()- 90)))
  OR (ROS.RepairOrderStatus = 'INVOICED' AND ROI.InvoiceDate > '2019-01-01 00:00:00.000'))
  AND (CUS.InternalAccount = '0' AND CUS.InternalLRCustomer = '0')

结果样本:

在此处输入图像描述

标签: sqlsql-server

解决方案


推荐阅读