oracle连接同一个表,但使用不同的日期



我有一个简单的表,包含两列Cust_Id和Sales:

custID_1| sales_1 |sales_date_1| 
01      | 100     |01/2021     | 
02      | 102     |02/2021     | 
07      | 10      |04/2021     | 
10      | 180     |05/2021     | 
12      | 90      |06/2021     | 

custID_2| sales_2 |sales_date_2| 
05      | 400     |02/2022     | 
06      | 110     |03/2022     | 
08      | 300     |04/2022     | 
11      | 80      |06/2022     | 

,我想在两个不同的日期同时显示结果,如下所示:

custID_1| custID_2 |sales_1 |sales_2 |sales_date_1|sales_date_2
01      | null     |100     |null    |01/2021     |null    
02      | 05       |102     |400     |02/2021     |02/2022
null    | 06       |null    |110     |null        |03/2022
07      | 08       |10      |300     |04/2021     |04/2022  
10      | null     |180     |null    |05/2021     |null        
12      | 11       |190     |80      |06/2021     |06/2022

这是我在下面尝试的,但我得到了重复的值:

Select S1.Cust_Id "custID_1", s2.Cust_Id "custID_2",
s1.Sales "sales_1", s2.Sales "sales_2",
s1.Sale_Date "sales_date_1", s2.Sale_Date "sales_date_2"
From Sales_Table S1 Left Join Sales_Table S2
On S1.Cust_Id = S2.Cust_Id
And S1.Sale_Date Between '01-01-21' And '31-10-21'
And S2.Sale_Date Between '01-01-22' And '31-10-22'

示例数据中的日期令人困惑,但我猜您想在不同年份的同一日期连接两个表。

当然,假设您的日期存储为类似date的数据类型,您可以full join并使用日期算法:

select s1.cust_id cust_id_1, cust_id_2, 
s1.sales sales_1, s2.sales sales_2,
s1.sale_date sale_date_1, s2.sale_date sales_date_2
from (
select * 
from sales_table 
where sale_date >= date '2021-01-01' and sale_date < '2022-01-01'
) s1
full join (
select * 
from sales_table 
where sale_date >= date '2022-01-01' and sale_date < '2023-01-01'
) s2 on s2.sale_date = s1.sale_date + interval '1' year

指出:

  • 这只适用于每个表中每个日期最多有一个销售;否则,行将以"乘"结束。在结果集中
  • 我对表进行了预过滤;但如果每个表只有一年的数据,则不需要此步骤

最新更新