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,得到两个单独的日期,然后将它们组合在一起,你的更好。