我有这样的查询
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
答案 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%')