0

個人と請求書の 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

また

 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
4

2 に答える 2

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)

私はこれをテストしました、そしてそれはうまくいきます!

于 2012-04-05T11:09:05.083 に答える
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 の一部をビュー/ストアド クエリに分割する必要がある場合があります。次に、ビュー/ストアド クエリに JOIN します。私が言ったように..それはしばしば複雑になります。しかし、それが 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
于 2012-04-06T15:20:23.533 に答える