如何基于多日期列关联两个SQL表?查询报错排查
错误原因分析
你的JOIN条件存在语法错误:AND [App Passed] AND [Sale Completed]部分未指定与Date_Table.[Date]的比较逻辑,数据库无法解析这种孤立的列名,这是导致SQL解析报错的直接原因。
解决方案:按日期统计各销售阶段数量
以下提供两种实用方案,可根据你的具体统计需求选择:
方案1:直接关联后条件计数
无需复杂JOIN逻辑,通过COUNT(CASE...)直接统计每个日期下各阶段的记录数:
SELECT dt.[Date], -- 统计当日产生Enquiry的数量 COUNT(CASE WHEN st.[Enquiry] = dt.[Date] THEN 1 END) AS Enquiry_Count, -- 统计当日收到App的数量 COUNT(CASE WHEN st.[App Rec] = dt.[Date] THEN 1 END) AS App_Rec_Count, -- 统计当日App通过的数量 COUNT(CASE WHEN st.[App Passed] = dt.[Date] THEN 1 END) AS App_Passed_Count, -- 统计当日完成销售的数量 COUNT(CASE WHEN st.[Sale Completed] = dt.[Date] THEN 1 END) AS Sale_Completed_Count FROM Date_Table dt LEFT JOIN Sales_Table st ON dt.[Date] IN (st.[Enquiry], st.[App Rec], st.[App Passed], st.[Sale Completed]) GROUP BY dt.[Date] ORDER BY dt.[Date]
如果需要统计累计到当日的各阶段完成总量(比如到当天为止已完成App Passed的总销售数),可修改条件并配合DISTINCT避免重复计数(假设Sales_Table有唯一主键Sale_ID):
SELECT dt.[Date], COUNT(DISTINCT CASE WHEN st.[Enquiry] <= dt.[Date] THEN st.Sale_ID END) AS Cumulative_Enquiry, COUNT(DISTINCT CASE WHEN st.[App Rec] <= dt.[Date] THEN st.Sale_ID END) AS Cumulative_App_Rec, COUNT(DISTINCT CASE WHEN st.[App Passed] <= dt.[Date] THEN st.Sale_ID END) AS Cumulative_App_Passed, COUNT(DISTINCT CASE WHEN st.[Sale Completed] <= dt.[Date] THEN st.Sale_ID END) AS Cumulative_Sale_Completed FROM Date_Table dt LEFT JOIN Sales_Table st ON dt.[Date] >= st.[Enquiry] GROUP BY dt.[Date] ORDER BY dt.[Date]
方案2:用UNPIVOT重构销售阶段数据
将Sales_Table的多列日期转换为「阶段-日期」的行数据,再关联统计,适合后续扩展销售阶段:
WITH Sales_Stages AS ( SELECT Sale_ID, Stage_Name, Stage_Date FROM Sales_Table UNPIVOT ( Stage_Date FOR Stage_Name IN ( [Enquiry], [App Rec], [App Passed], [Sale Completed] ) ) AS unpvt ) SELECT dt.[Date], COUNT(CASE WHEN ss.Stage_Name = 'Enquiry' THEN ss.Sale_ID END) AS Enquiry_Count, COUNT(CASE WHEN ss.Stage_Name = 'App Rec' THEN ss.Sale_ID END) AS App_Rec_Count, COUNT(CASE WHEN ss.Stage_Name = 'App Passed' THEN ss.Sale_ID END) AS App_Passed_Count, COUNT(CASE WHEN ss.Stage_Name = 'Sale Completed' THEN ss.Sale_ID END) AS Sale_Completed_Count FROM Date_Table dt LEFT JOIN Sales_Stages ss ON dt.[Date] = ss.Stage_Date GROUP BY dt.[Date] ORDER BY dt.[Date]
内容的提问来源于stack exchange,提问作者Russell
相关产品推荐
相关产品推荐

