我有一个简单的表,包含两列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
指出:
- 这只适用于每个表中每个日期最多有一个销售;否则,行将以"乘"结束。在结果集中
- 我对表进行了预过滤;但如果每个表只有一年的数据,则不需要此步骤