2013-12-13 195 views
0

我有兩個表具有以下字段SQL查詢返回的最大記錄

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 

這將返回那些之前的特定日期(前兩年到今天)部分和transids,但部分也具有有invoicedate transids在過去的2年內。

任何人都可以幫助我嗎?

+0

你想包括其中有有部分根本沒有訂單? –

+0

這不應該是一個問題,因爲這兩個表是訂單的標題和明細表。理論上,我應該把所有物品放在桌子上。 – jamesk

回答

0

變化:

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

到:

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

UPDATE:

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 
+0

這仍然是返回在過去2年內有發票日期的零件。 – jamesk

+0

好,已更新。我對你使用'RIGHT OUTER JOIN'感到困惑,這意味着你想要的標題沒有相應的細節,這將使測試零件ID變得毫無意義。 – Barmar

+0

需要爲此添加一層複雜性,對不起。現在我需要綁定項目表。該表是所有項目的列表。他們可能或可能不是訂單的一部分。連接將是item.itemid = detail.partid。這看起來是否正確? – jamesk

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 
;