2012-04-05 19 views
0

人物と請求書の2つのテーブルがあります。 人数ごとに多くの請求書行があり、最後の請求書金額のすべての人物情報を選択します。2つ目のテーブルの条件付き複数テーブル結合

code | Name | .... 
1  | name1 
2  | name1 
3  | name1 

請求書

ID | person_code | amount | date 
1  | 2   | 30000 | 12 
2  | 1   | 40000 | 10 
3  | 3   | 50000 | 12 
4  | 2   | 60000 | 14 
5  | 3   | 70000 | 12 
6  | 2   | 80000 | 12 
7  | 1   | 90000 | 18 

私は

person code | person name | last amount 
1   | name1  | 90000 
2   | name2  | 60000 
3   | name3  | 70000 

または

を選択します3210
SELECT person.code , person.name , lastinvoice.amount 
FROM person 
LEFT JOIN 
    (SELECT * FROM invoice where invoice.person_code=person.code order by date, ID) as 
lastinvoice ON lastinvoice.person_code = person.code 

は、このクエリは、MSへのアクセスでは動作しません:

select * from invoice as i where id=(select max(id) from invoice where personCode=i.personcode and date=(select max(date) from invoice where personCode=i.PersonCode 

答えて

0

あなたは

SELECT p.code, p.name, i.amount 
FROM person p 
INNER JOIN invoice i on i.person_code = p.code AND i.date = 
    (SELECT MAX(date) FROM invoice WHERE person_code = p.code) 
AND i.ID = (SELECT MAX(ID) FROM invoice where person_code = p.code AND ID = i.ID) 

私はこれをテストしてみた、それが正常に動作を行うことができます!

+0

このクエリは、2つの内の選択 – Hamid

+0

と低い性能を有していると私は両方のMS SQL上でそれを実行したいですmsアクセスにはアクセスできませんが、このquryはアクセスできません。 – Hamid

+1

@Hamid:これを基盤として使用して構築してください。コピー/ペースト可能なコードを手渡すと約束した人はいません。 – cHao

0

同じ人に複数の支払いがある可能性があるため、同じ日に最新の支払いを見つけるために同点を破る方法が必要です。あなたはID列(自動番号)を使用することはできません。ただし、追加のクエリが必要です.1つは最大日付を取得し、もう1つはその日付の最大IDを取得することです。

SELECT p.code, i.[Date], i.amount 
FROM Person p INNER JOIN 
    ( Invoice i INNER JOIN 
      (
       SELECT MAX(mxi.ID) AS MaxID, mxi.person_code, mxd.latestDate 
       FROM Invoice mxi INNER JOIN 
         (
          SELECT person_code, MAX([Date]) AS LatestDate 
          FROM Invoice 
          GROUP BY person_code 
         ) mxd ON mxd.person_code = mxi.person_code AND mxd.latestDate = mxi.[Date] 
       GROUP BY mxi.person_code, mxd.latestDate 
      ) lt ON lt.MaxID = i.ID 
    ) ON p.code = i.person_code 

問題が発生しました。上記のクエリは、最初の結合をINNERからLEFTに変更するまで機能します。それから、Accessは複雑すぎる/曖昧であると不平を言う。 (Accessに精通している方が、制限を満たすためにそれを書き直すかもしれません。)そうでない場合は、SQLの一部をビュー/ストアドクエリに分割する必要があります。次に、ビュー/ストアド・クエリーにジョインします。私が言ったように..それはしばしば複雑になる。しかし、Accessを幸せにするために私が考えることができる唯一の方法です。

vLatestInvoice(ストアドクエリ/ビュー)

SELECT i.ID, i.person_code, i.[Date], i.amount 
FROM Invoice AS i INNER JOIN 
     ( SELECT MAX(mxi.ID) AS MaxID, mxi.person_code, mxd.latestDate 
      FROM Invoice mxi INNER JOIN 
         (
         SELECT person_code, MAX([Date]) AS LatestDate 
         FROM Invoice 
         GROUP BY person_code 
        ) mxd ON mxd.person_code = mxi.person_code AND mxd.latestDate = mxi.[Date] 
      GROUP BY mxi.person_code, mxd.latestDate 
     ) AS lt ON lt.MaxID = i.ID; 

メインクエリ:

SELECT p.code, l.[Date], l.amount 
FROM Person p LEFT JOIN vLatestInvoice l ON l.person_code = p.code 
関連する問題