SQL Выбор отдельных записей из двух таблиц - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь написать оператор 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.

Ответы [ 2 ]

0 голосов
/ 16 января 2020
select CompanyName,MAX(SaleDate) SaleDate from Account a
inner join Transheader b on a.id = b.accountid
group by CompanyName
order by 1   
0 голосов
/ 16 января 2020

Один из вариантов - выбрать максимальную дату в предложении выбора.

select
  a.*,
  (
    select max(th.saledate)
    from transheader th
    where th.accountid = a.id
    and th.saledate >= '2016-01-01'
    and th.saledate < '2019-01-01'
  ) as max_date
from account a
where a.isactive = 1
order by a.id;

Если вы хотите отображать только заголовки транзакций с датами продаж в данном диапазоне дат, то вы можете просто присоединить максимальное количество даты со счетами. Чтобы сделать это, вы должны сгруппировать агрегацию даты по аккаунту:

select a.*, th.max_date
from account a
join
(
  select accountid, max(saledate) as max_date
  from transheader
  and saledate >= '2016-01-01'
  and saledate < '2019-01-01'
  group by accountid
) th on th.accountid = a.id
where a.isactive = 1
order by a.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...