SQL查询返回最大记录

时间:2013-12-13 23:51:46

标签: sql max

我有两个包含以下字段的表

Order Header
TransID, InvoiceDate

Order Detail
TransID, PartID

我正在尝试编写一个查询,该查询将返回自特定日期以来没有订单标题条目的那些部分。

标头表每个transid有1行,其中详细信息表可以有多行。

以下是我一直在尝试的内容:

select h.transid,partid, h.invoicedate
from tblaphistdetail d
right outer join tblaphistheader h
on d.transid = h.transid
where partid <> ''
and h.invoicedate <= dateadd(yyyy,-2,getdate())
group by h.transid,partid, invoicedate
order by partid

这将返回特定日期之前(今天之前2年)的那些部分和转换,但这些部分也有过去2年内具有发票的转换。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

变化:

and h.invoicedate <= dateadd(yyyy,-2,getdate())

为:

and h.transid NOT IN (SELECT transid
                      FROM tblaphisheader
                      WHERE invoicedate > dateadd(yyyy,-2,getdate()))

更新:

select h.transid,partid, h.invoicedate
from tblaphistdetail d
inner join tblaphistheader h
on d.transid = h.transid
where partid <> ''
and partid NOT IN (SELECT partid
                   FROM tblaphisdetail d
                   INNER JOIN tblaphistheader h
                   ON d.transid - h.transid
                   WHERE invoicedate > dateadd(yyyy,-2,getdate()))
group by h.transid,partid, invoicedate
order by partid

答案 1 :(得分:0)

如果您只想包含订单存在但尚未包含特定日期的部件,您可以尝试以下操作:

SELECT
  d.PartID,
  MAX(h.InvoiceDate) AS LastOrdered
FROM
  dbo.tblaphistdetail AS d
INNER JOIN
  dbo.tblaphistheader AS h ON d.TransID = h.TransID
GROUP BY
  d.PartID
HAVING
  MAX(h.InvoiceDate) < @SpecificDate
;

如果有一个Parts表,其中包含所有可用的部分,并且您想要包含那些从未包含在发票中的部分,那么这是另一个解决方案:

SELECT
  p.PartID,
  MAX(h.InvoiceDate) AS LastOrdered
FROM
  dbo.tblaphistdetail AS d
INNER JOIN
  dbo.tblaphistheader AS h ON d.TransID = h.TransID
RIGHT JOIN
  dbo.Parts AS p ON d.PartID = p.PartID
GROUP BY
  p.PartID
HAVING
  MAX(h.InvoiceDate) < @SpecificDate
  OR MAX(h.InvoiceDate) IS NULL
;