2012-03-27 28 views
2

我試圖從一張表(發票)中選擇最近的日期到另一張表上的客戶。我不是在尋找一個客戶,而是幾個。我想這樣做看起來是這樣的:單獨表上的聚合函數

select C.[Last Name], C.[First Name], C.[State], I.[Date] 
From myDb.dbo.Customer C 
left join myDb.dbo.Invoice I on I.CustomerID = C.CustomerID 
where [email protected] and i.date = max(i.date) 

我知道我不能在其中Max(),我試圖用HAVING。我無法爲customerID分配本地變量,並執行where i.date = (select...)。我試圖將這一切保持爲一個聲明,因爲這是在一個數據庫中對多個數據庫執行的。

更新:
我決定改變我的設計要求,因爲這不是最優化的解決方案。

+0

不知道我是否理解這個問題。您想要獲得特定狀態下所有客戶的列表以及各自最後一張發票的日期? – Corbin 2012-03-27 21:18:28

+0

爲什麼單個發票上會有多個客戶? – mellamokb 2012-03-27 21:19:30

+0

它將是所有客戶的列表,以及每個客戶的最新發票日期。 – 2012-03-27 21:27:15

回答

1

你可能想組:

select C.[Last Name], C.[First Name], C.[State], max(I.[Date]) as [Date] 
from myDb.dbo.Customer C 
    left join myDb.dbo.Invoice I on I.CustomerID = C.CustomerID 
where C.state = @State 
group by C.[Last Name], C.[First Name], C.[State] 

更新時間:

select A.[Last Name], A.[First Name], A.[State], B.[Date] 
from myDb.dbo.Customer A 
    join (
     -- Get Customers by State with their most recent Invoice Date 
     select C.[CustomerID], max(I.[Date]) as [Date] 
     from myDb.dbo.Customer C 
      left join myDb.dbo.Invoice I on I.[CustomerID] = C.[CustomerID] 
     where C.[State] = @State 
     group by C.[CustomerID] 
    ) B on A.[CustomerID] = B.[CustomerID] 
+0

可悲的是,如果客戶轉移到另一個狀態,我得到一個重複的結果 – 2012-03-27 21:30:43

+0

不起作用,我不知道我明白where條款,但我已經提出了另一種可能性。 – 2012-03-27 21:45:04

+0

你證明是最有幫助的,所以,我將這標記爲答案,只是爲了解決問題。謝謝您的幫助。決定只是改變一些設計。 – 2012-03-28 14:36:52

1
;with cte as 
(
select C.[Last Name], C.[First Name], C.[State], I.[Date] 
From myDb.dbo.Customer C 
left join myDb.dbo.Invoice I on I.CustomerID = C.CustomerID 
where [email protected] 
) select * from cte where cte.Date = (select max (cte.Date) from cte) 
0
select C.[Last Name], C.[First Name], C.[State], I.[Date] , 
(select top 1 date from invoice I where I.CustomerID = C.CustomerID order by date desc) 
From myDb.dbo.Customer C 
1

派生表返回每個客戶的最後發票日期。然後再與客戶聯繫。

select C.[Last Name], C.[First Name], C.[State], LastInvoice.LastInvoiceDate 
from myDb.dbo.Customer C 
inner join 
(
    select I.CustomerID, max (I.Date) LastInvoiceDate 
     from myDb.dbo.Invoice I 
    group by I.CustomerID 
) LastInvoice 
    on C.CustomerID = LastInvoice.CustomerID 

可以有重複的,如果客戶有在同一天更發票(大概日期不包含時間部分)。你可以用不同的東西來整理它。