Я пытаюсь написать оператор SQL, который будет возвращать набор Distinct set CompanyNames из таблицы на основе самой последней SaleDate с указанным диапазоном дат из другой таблицы. T01 = Account T02 = TransHeader
Важные поля: T01.ID, T01.CompanyName T02.AccountID, T02.SaleDate
T01.ID = T02.AccountID
То, что я хочу вернуть, - это Макс SaleDate для каждого CompanyName без дубликатов CompanyNames и только Max (SaleDate) в качестве LastSale. Я буду использовать условие Where для ограничения диапазона SaleDate.
Я попробовал следующее, но он возвращает все записи для всех SalesDates в диапазоне. Это приводит к тому, что одна и та же компания отображается в списке несколько раз.
Текущий MS- SQL Запрос
SELECT T01.CompanyName, T02.LastSale
FROM
(SELECT DISTINCT ID, IsActive, ClassTypeID, CompanyName FROM Account) T01
FULL OUTER JOIN
(SELECT DISTINCT AccountID, TransactionType, MAX(SaleDate) LastSale FROM TransHeader group by AccountID, TransactionType, SaleDate) T02
ON T01.ID = T02.AccountID
WHERE ( ( T01.IsActive = 1 )AND
( (Select Max(SaleDate)From TransHeader Where AccountID = T01.ID AND TransactionType in (1,6) AND SaleDate is NOT NULL)
BETWEEN '01/01/2016' AND '12/31/2018 23:59:00' AND (Select Max(SaleDate)From TransHeader Where AccountID = T01.ID AND TransactionType in (1,6) AND SaleDate is NOT NULL) IS NOT NULL
)
)
ORDER BY T01.CompanyName
Я думал, что FULL OUTER JOIN был билетом, но он не работает, и я застрял.
Пример данных Счет Таблица (T01)
ID CompanyName IsActive ClassTypeID
1 ABC123 1 1
2 CDE456 1 1
3 EFG789 1 1
4 Test123 0 1
5 Test456 1 1
6 Test789 0 1
Пример данных Transheader Таблица (T02)
AccountID TransactionType SaleDate
1 1 02/03/2012
2 1 03/04/2013
3 1 04/05/2014
4 1 05/06/2014
5 1 06/07/2014
6 1 07/08/2015
1 1 08/09/2016
1 1 01/15/2016
2 1 03/20/2017
2 1 03/21/2017
3 1 03/04/2017
3 1 04/05/2018
3 1 05/27/2018
4 1 06/01/2018
5 1 07/08/2018
5 1 08/01/2018
5 1 10/11/2018
6 1 11/30/2018
Желаемые результаты
CompanyName LastSale (Notes note returned in the result)
ABC123 01/15/2016 (Max(SaleDate) LastSale for ID=1)
CDE456 03/21/2017 (Max(SaleDate) LastSale for ID=2)
EFG789 05/27/2018 (Max(SaleDate) LastSale for ID=3)
Testing456 10/11/2018 (Max(SaleDate) LastSale for ID=5)
ID=4 & ID=6 are note returned because IsActive = 0 for these records.