レコードが作成されるたびに、レコードに ID が割り当てられたテーブルを作成します。
複数年の記録があります (年がスキップされる場合があるため、2019、2017、2016 などになります)。
レコードには、テキストとしての Year フィールドとテキストとしての Name フィールド (この Name フィールドは年を通じて同一)、および日付としての AptDate フィールドが含まれます。
Access SQL クエリを使用して以下を表示したい:
名前、現在の年、現在の年の AptDate、'前の' 年の AptDate (名前は同一で、年は次に最近の年になります)
SQL でここまで来ました (EnteredSampleName の「前年」の AptDate を表示します):
SELECT Table.AptDate
FROM Table
WHERE (((Table.Name)=[EnteredSampleName]) AND ((Year=(SELECT Max(Table.Year) AS LastYear
FROM Table
WHERE (((Table.Year)<(SELECT MAX(Table.Year) FROM Table WHERE ((Table.Name)=[EnteredSampleName]))))))));
EnteredSampleName を削除し、すべてのレコードに対してこの「以前の」AptDate を表示したいと思います (この名前の以前のレコードが存在しない可能性があるため、一部の「以前の」年は Null になる可能性があります)。
この問題を解決することはできないようです。どなたか助けていただければ幸いです。
役に立つご返信をありがとうございます。すぐにテストしてみます。
とりあえず、リーの要望に答えると:
サンプル テーブルは次のようになります。
ID Name Year AptDate
1 A 2015 2015-02-02
2 B 2015 2015-03-05
3 C 2017 2017-04-04
4 B 2017 2017-06-09
5 C 2018 2018-07-03
6 A 2018 2018-09-10
7 A 2019 2019-01-08
8 D 2019 2019-01-09
クエリ結果の目標:
Name Year AptDate AptDatePrevious
A 2019 2019-01-08 2018-09-10
B 2017 2017-06-09 2015-03-05
C 2018 2018-07-03 2017-04-04
D 2019 2019-01-09
予想どおり、D には AptDatePrevious がありません。これで明確になったと思います。ありがとうございます。
答え1
この MS サイトの番号付きの例が、正しい方向を指し示している可能性があります。
https://support.office.com/en-us/article/nest-a-query-inside-another-query-or-in-an-expression-by-using-a-subquery-a8532322-e42f-4f94-bc38-ace7c182916a
必要な作業は次のようになります。
Table.Name、Table.Year、Table.AptDate、expr(ここで前の日付を計算*)をTable
Order by {任意の方法}から選択します
*表現は次のようになります:
テーブルから PrevAptDate.AptDate を PrevAptDate として選択します
(PrevAptDate.AptDate < Table.AptDate) かつ
(
PrevAptDate.Name = Table.Name)
これはすべて思いつきですが、近いものであり、正しい方向を指し示すものになるはずです。お役に立てば幸いです。
答え2
セットアップと要件を正しく理解していると仮定すると、相関サブクエリではなく結合を使用する 1 つの方法を以下に示します。
select t0.name, t0.year, t0.aptdate, q2.aptdate
from YourTable t0 left join
(
select t1.name, t1.aptdate
from YourTable t1 inner join
(
select t2.name, max(t2.year) as lastyear
from YourTable t2
where t2.year < year(date())
group by t2.name
) q1 on
t1.name = q1.name and
t1.year = q1.lastyear
) q2 on
t0.name = q2.name
where t0.year = year(date())
上記のクエリで、 のすべての出現をYourTable
テーブルの名前に置き換えます。
ここで、最も内側のクエリは、が現在の年 より小さい各 のq2
最大値を取得します。year
name
year
year(date())
aptdate
このクエリの結果は、それぞれに対応するname
最大値を選択するために、元のテーブルと内部結合されますyear
。これにより、サブクエリが形成されますq2
。
最後に、元の表は左サブクエリに結合されq2
(指定された名前の前年のレコードがない場合)、結果は親クエリによって出力されます。