레코드가 생성될 때 레코드에 할당된 ID가 있는 테이블을 갖습니다.
여러 해에 대한 기록이 있습니다(때로는 연도를 건너뛰므로 2019, 2017, 2016 등이 있을 수 있음).
레코드에는 텍스트로 연도 필드, 텍스트로 이름 필드(이 이름 필드는 연도에 걸쳐 동일함), 날짜로 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일 수 있음).
이 너트를 깰 수 없는 것 같습니다. 도움을 주시면 대단히 감사하겠습니다.
유용한 답변에 감사드립니다. 곧 테스트해 보겠습니다.
그동안 Lee의 요청에 응답하려면 다음과 같이 하세요.
샘플 테이블은 다음과 같습니다.
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
Order 에서 Table.Name, Table.Year, Table.AptDate, expr(여기서 이전 날짜 계산*)을 선택하세요 .
*표현은 다음과 같습니다.
테이블에서 max(PrevAptDate.AptDate를 PrevAptDate로 선택합니다
. 여기서 (PrevAptDate.AptDate < Table.AptDate)
및
(PrevAptDate.Name = Table.Name)
이것은 모두 커프에서 벗어난 것이지만 가까이 있어야 하며 올바른 방향을 가리킬 수 있어야 합니다. 도움이 되었으면 좋겠습니다.
답변2
귀하의 설정 및 요구 사항을 올바르게 이해했다고 가정하면 상관 하위 쿼리가 아닌 조인을 사용하는 가능한 방법 중 하나는 다음과 같습니다.
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
(주어진 이름에 대한 이전 연도 레코드가 없는 경우) 결과는 상위 쿼리에 의해 출력됩니다.