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

Sql 如何获取组中的最后工作日期,sql,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.JBC

我有这样的疑问

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
我需要一个查询,结果如下 如果有“人工”,则使用人工中的最后一个工作日期,如果发票中没有人工,则使用最后一个日期。因此,每个发票的最终结果只有一行,在这种情况下是(不需要显示说明)。我尝试使用case when语句,但我不能正确地使用它。请帮忙。谢谢

12     1000223      2012-12-09     
试试这个

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%')

如果向查询中添加case语句,则只能获取laborardate的MaxDate。大小写表达式如下所示:

MAX(case when C.Description = 'Labor' then B.JCDate else null end) AS LastLaborDay
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
如果添加并运行它,现在将有两列。一个有最长日期,另一个有最长劳动日期。。。如果为非人工,则为空

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

它看起来像这样:

MAX(case when C.Description = 'Labor' then B.JCDate else null end) AS LastLaborDay
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

看一看,如果需要可以调整。

最后的日期是什么?只是发票的最长日期。当发票有人工时,请使用“人工”组中的“最长日期”,否则,只需使用该发票的“最长日期”数据,而不考虑描述。您是否希望如问题底部所示,以单行作为输出?(即,输出中没有“说明”)?是的,我只需要一行谢谢。但它给了我相同的结果,因为它仍然按说明分组。结果中是否需要一行而不是三行?谢谢。我也用同样的方法使用Union all,得到两个单独的日期,然后将它们组合在一起,你的更好。