如何在多个日期列上连接两个 SQL 表

问题描述 投票:0回答:1

我的第一个表名为 Date_Table,它包含一年中从 2020 年 1 月开始一直到 2030 年 12 月 31 日的所有日期。数据如下所示:

日期
2020/01/01 00:00 周三
2020年2月1日00:00 周四

我的第二个表Sales_Table由销售阶段组成,每个阶段都有一个到达该阶段时分配的日期。 这是我的数据的样子:

销售_ID 询问 应用程序记录 应用通过 销售完成
1 2020/01/01 00:00 2020年2月1日00:00 2020/03/01 00:00 2020/05/01 00:00
2 2020年2月1日00:00 2020/03/01 00:00 2020/03/01 00:00 2020/05/01 00:00

到目前为止我的查询是这样的:

SELECT COUNT(CASE WHEN [Enquiry] IS NOT NULL THEN 1
 END) AS [Total Enquiries],
      COUNT(CASE WHEN [App Rec] IS NOT NULL THEN 1
 END) AS [Apps Received],
      COUNT(CASE WHEN [App Passed] IS NOT NULL THEN 1
 END) AS [Apps Passed],
      COUNT(CASE WHEN [Sale Completed] IS NOT NULL THEN 1
 END) AS [Completed Sales]
FROM [Date_Table]
      LEFT JOIN [Sales_Table] ON [Date] Between [Enquiry] AND [App Rec] GROUP BY [Date]

这对于前 2 个日期似乎工作正常,但如果我在连接中添加另一个 AND 语句,我会收到 SQL 查询解析失败错误。

最终报告将是这样的表格:

日期 询问 应用程序记录 应用通过 销售完成
2020/01/01 00:00 3 6 4 2
2020年2月1日00:00 5 1 11 4

我尝试使用 BETWEEN 和 AND 将所有日期字段添加到左连接 像这样:

LEFT JOIN [Sales_Table] ON [Date] Between [Enquiry] AND [App Rec] AND [App Passed] AND [Sale Completed]

这只是给了我一个解析错误

sql left-join case between
1个回答
0
投票

参见示例

with t as(
select 'Enquiry'event,Enquiry as dt
from Sales_Table
union all
select 'App_Rec',App_Rec
from Sales_Table
union all
select 'App_Passed',App_Passed
from Sales_Table
union all
select 'Sale_Completed',Sale_Completed
from Sales_Table
)
,totals as(
select dt
   ,sum(case when event='Enquiry' then 1 else 0 end)Enquiry
   ,sum(case when event='App_Rec' then 1 else 0 end)App_Rec
   ,sum(case when event='App_Passed' then 1 else 0 end)App_Passed
   ,sum(case when event='Sale_Completed' then 1 else 0 end)Sale_Completed
from t
group by dt
)
select *
from Date_Table d
left join totals t on t.dt=d.date

输出是

日期 dt 询问 应用_记录 应用_通过 销售_已完成
2020-01-01 周三 2020-01-01 1 0 0 0
2020-01-02 周四 2020-01-02 1 1 0 0
2020-01-03 弗里德 2020-01-03 0 1 2 0
2020-01-04 萨图
2020-01-05 桑德 2020-01-05 0 0 0 2

有测试数据

create table Date_table(Date date,  Day varchar(10));
insert into Date_Table ([date]) values 
 ('2020-01-01')
,('2020-01-02')
,('2020-01-03')
,('2020-01-04')
,('2020-01-05')
;
update Date_Table
  set [Day]=left(datename(dw,[date]),4)
;
create table Sales_Table (Sale_ID int,Enquiry date,App_Rec date, App_Passed date, Sale_Completed date);
insert into Sales_Table values
 (1,'2020-01-01','2020-01-02','2020-01-03','2020-01-05')
,(2,'2020-01-02','2020-01-03','2020-01-03','2020-01-05')
;
© www.soinside.com 2019 - 2024. All rights reserved.