2012-03-27 13 views
2

あるテーブル(請求書)から別のテーブルの顧客に最新の日付を選択しようとしています。私は一人の顧客を探しているのではなく、いくつかを探しています。私はどこにMax()を持つことができない、と私はHAVINGを使用してみました知っている別表の集計機能

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) 

:私は何をしたい、このようになります。私はcustomerIDのために地元のVARを割り当て、where i.date = (select...)を行うことはできません。私はこれを1つのステートメントとして保持しようとしています。これは、1つのDBから複数のDBで実行されているためです。

更新:
これは最適な解決策ではないため、設計要件を変更することにしました。

+0

質問を理解しているかどうかわかりません。あなたは、特定の状態とそれぞれの最後の請求書の日付からのすべての顧客のリストを取得したいですか? – Corbin

+0

なぜ、単一の請求書に複数の顧客があるでしょうか? – mellamokb

+0

は、すべての顧客のリストと、各顧客の最新の請求書日付を含む状態となります。 –

答えて

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

悲しいことに、顧客が別の州に移動した場合、重複した結果が返ってくる –

+0

Where句を理解できないのか分かりませんが、別の可能性を提示しました。 –

+0

あなたが最も有益であることを証明したので、私はこれを答えとしてマークして質問を終了します。助けてくれてありがとう。デザインを一部変更することに決めました。 –

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 

顧客が(おそらく日付は時間のコンポーネントが含まれていない)同じ日に多くの請求書を持っていた場合は重複が存在する場合があります。あなたは別のものでそれを並べ替えるかもしれません。