SQL Select 来自两个表的不同记录

SQL Select Distinct Records From Two Tables

我正在尝试编写一个 SQL 语句,该语句将 return 一组不同的 CompanyNames 来自 table 基于最近的 SaleDate 指定日期范围从另一个 table。 T01 = 帐户 T02 = 转头

重要的领域是: T01.ID、T01.CompanyName T02.AccountID、T02.SaleDate

T01.ID = T02.AccountID

我想要 return 的是每个 CompanyName 的 Max SaleDate,没有任何重复的 CompanyNames,只有 Max(SaleDate) 作为 LastSale。我将使用 Where 子句来限制 SaleDate 范围。

我尝试了以下操作,但它 return 包含范围内所有 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 是票证,但它不起作用,我被卡住了。

样本数据账户Table(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

示例数据 转头 table (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.

一个选项是 select select 子句中的最大日期。

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;

如果您只想显示销售日期在给定日期范围内的交易 headers,那么您可以将最大日期与帐户进行内部联接。为此,您必须按帐户对日期聚合进行分组:

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;
select CompanyName,MAX(SaleDate) SaleDate from Account a
inner join Transheader b on a.id = b.accountid
group by CompanyName
order by 1