如何获取组中的最后一个工作日期

时间:2013-11-12 20:04:06

标签: sql

我有这样的查询

SELECT        
  A.JBCo, A.Invoice, MAX(B.JCDate) AS LastWorkedDay, C.Description
FROM            
  C 
INNER JOIN A ON 
  C.JBCo = A.JBCo AND 
  C.BillMonth = A.BillMonth AND 
  C.BillNumber =  A.BillNumber 
INNER JOIN B ON 
  C.JBCo = B.JBCo AND 
  C.BillMonth = B.BillMonth AND 
  C.BillNumber = B.BillNumber AND 
  C.Line = B.Line
GROUP BY 
  A.Invoice, A.JBCo, C.Description
HAVING        
  (A.JBCo = 12) AND 
  (A.Invoice LIKE '%1000223%')

得到的结果如

Co          invoice             Lastworkdate        description
12         1000223              2012-12-9             Labor
12         1000223              2012-12-7             Equipment
12         1000223              2012-12-2              Material

我需要一个查询结果 如果有' Labor',则在人工中使用lastWorkedDate,如果Invoice中没有人工,则使用持续日期。所以最终结果只会是每张发票一行,在这种情况下会是(没有必要显示说明)。我尝试使用case语句,但我无法正确。请帮忙。感谢

12     1000223      2012-12-09     

2 个答案:

答案 0 :(得分:1)

如果向查询添加case语句,则只能获得LaborDates的MaxDate。案例表达式如下所示:

MAX(case when C.Description = 'Labor' then B.JCDate else null end) AS LastLaborDay

如果添加并运行它,您现在将有两列。一个具有最大日期,另一个具有最大劳动日期...具有null,其中它是非劳动力。

您现在可以将此查询结果用作嵌套表。您可以按发票分组以缩减为单行。您还可以找到两个日期列的最大值。如果没有人工,那么max将为null。因此,使用COALESCE()选择第一个非null。

看起来像这样:

select JBCO, invoice, max(LastLaborDay), max(LastWorkedDay), coalesce(max(LastLaborDay), max(LastWorkedDay))
from 
(
SELECT        
  A.JBCo, A.Invoice, MAX(B.JCDate) AS LastWorkedDay, 
  MAX(case when C.Description = 'Labor' then B.JCDate else null end) AS LastLaborDay, 
  C.Description
FROM            
  C 
INNER JOIN A ON 
  C.JBCo = A.JBCo AND 
  C.BillMonth = A.BillMonth AND 
  C.BillNumber =  A.BillNumber 
INNER JOIN B ON 
  C.JBCo = B.JBCo AND 
  C.BillMonth = B.BillMonth AND 
  C.BillNumber = B.BillNumber AND 
  C.Line = B.Line
GROUP BY 
  A.Invoice, A.JBCo, C.Description
HAVING        
  (A.JBCo = 12) AND 
  (A.Invoice LIKE '%1000223%')
) TBL1

看看at this SQL Fiddle,如果需要,可以进行调整。

答案 1 :(得分:0)

试试这个

SELECT        
  A.JBCo, A.Invoice, 
CASE WHEN description="Labor" THEN MAX(B.JCDate) ELSE MAX(B.JCDate) END AS LastWorkedDay, 
  C.Description
FROM            
  C 
INNER JOIN A ON 
  C.JBCo = A.JBCo AND 
  C.BillMonth = A.BillMonth AND 
  C.BillNumber =  A.BillNumber 
INNER JOIN B ON 
  C.JBCo = B.JBCo AND 
  C.BillMonth = B.BillMonth AND 
  C.BillNumber = B.BillNumber AND 
  C.Line = B.Line
GROUP BY 
  A.Invoice
HAVING        
  (A.JBCo = 12) AND 
  (A.Invoice LIKE '%1000223%')