Sql 同一表上的左外部联接返回0条记录
我已经在其他帖子上搜索了我的问题,但没有任何效果 我有一个表,其中包含了餐厅的客户和营业额预测数据,计划值和实现值都在同一个表中(必须与以前的数据库保持相同) 我需要获得某一特定餐厅(现场)和特定活动(餐厅、外卖、点击n收集)以及某一日期范围(通常为一个月)去年的计划预测和实现预测 我的问题是,当计划的预测不存在,并且上一年实现的预测存在时,请求不返回任何内容 这是我的要求:Sql 同一表上的左外部联接返回0条记录,sql,oracle,join,Sql,Oracle,Join,我已经在其他帖子上搜索了我的问题,但没有任何效果 我有一个表,其中包含了餐厅的客户和营业额预测数据,计划值和实现值都在同一个表中(必须与以前的数据库保持相同) 我需要获得某一特定餐厅(现场)和特定活动(餐厅、外卖、点击n收集)以及某一日期范围(通常为一个月)去年的计划预测和实现预测 我的问题是,当计划的预测不存在,并且上一年实现的预测存在时,请求不返回任何内容 这是我的要求: SELECT P.AFO_ACTIVITY_ID, P.AFO_SITE_ID, P.AFO_
SELECT
P.AFO_ACTIVITY_ID,
P.AFO_SITE_ID,
P.AFO_FORECAST_DATE,
P.AFO_SERVICE_ID,
P.AFO_PLANNED_CUSTOMERS,
P.AFO_REALIZED_CUSTOMERS,
P.AFO_GROUP_CUSTOMERS,
P.AFO_PLANNED_TURNOVER,
P.AFO_REALIZED_TURNOVER,
P.AFO_GROUP_TURNOVER,
P.AFO_NB_EMPLOYEES,
P.AFO_TURNOVER_EMPLOYEES,
P.AFO_ID,
p2.AFO_REALIZED_CUSTOMERS AS REAL_CUSTOMERS_PREVIOUS_YEAR,
p2.AFO_REALIZED_TURNOVER AS REAL_TURNOVER_PREVIOUS_YEAR
FROM
ACT_FORECAST P
LEFT OUTER JOIN
act_forecast p2 ON p2.AFO_FORECAST_DATE = p.AFO_FORECAST_DATE - 364
AND p2.AFO_SITE_ID = p.AFO_SITE_ID
AND p2.AFO_ACTIVITY_ID = p.AFO_ACTIVITY_ID
AND p2.AFO_SERVICE_ID = p.AFO_SERVICE_ID
WHERE
P.AFO_SITE_ID = :siteid
AND P.AFO_ACTIVITY_ID = :activityid
AND P.AFO_FORECAST_DATE BETWEEN :startdate AND :enddate
如果我播放2018年2月的请求,我有我的数据(2018年和2017年)
但是如果我在2019年2月玩,我什么都没有,今年计划的部分也可以,因为预测还没有完成,但对于上一年的部分,我应该有一些数据
我也试过右外接,但没有成功 样本数据:
ActivityId SiteId ForecastDate ServiceId PlannedCustomers RealizedCustomers GroupCustomers PlannedTurnover RealizedTurnover GroupTurnover NbEmployeeMeal TurnoverEmployeeMeal ID RealizedCustomersPreviousYear RealizedTurnoverPreviousYear
1 58 01/02/18 1 0 0 0 0 11 0 0 11 2953773 0 39,85
1 58 01/02/18 3 345 398 0 3467,25 4052,01 0 0 0 2953774 328 3291,53
1 58 01/02/18 5 10 16 0 140 194,04 0 16 60,9 2953775 7 91,12
1 58 01/02/18 7 125 151 0 1200 1413,93 0 0 0 2953776 112 1063,89
有什么想法吗
关于我惊讶地看到
-364
(我的专业知识可能比不上你),并期望:
p.AFO_FORECAST_DATE - INTERVAL 364 DAY
也许这被解释为(微)秒
(典型的调试是省略部分条件,如AFO_FORECAST_DATE上的条件。)我惊讶地看到
-364
(我的专业知识可能比你的少),并期望:
p.AFO_FORECAST_DATE - INTERVAL 364 DAY
也许这被解释为(微)秒
(典型的调试是省略部分条件,如AFO_FORECAST_DATE。)使用以下内容:
SELECT P.AFO_ACTIVITY_ID,
P.AFO_SITE_ID,
P.AFO_FORECAST_DATE,
P.AFO_SERVICE_ID,
P.AFO_PLANNED_CUSTOMERS,
P.AFO_REALIZED_CUSTOMERS,
P.AFO_GROUP_CUSTOMERS,
P.AFO_PLANNED_TURNOVER,
P.AFO_REALIZED_TURNOVER,
P.AFO_GROUP_TURNOVER,
P.AFO_NB_EMPLOYEES,
P.AFO_TURNOVER_EMPLOYEES,
P.AFO_ID,
p2.AFO_REALIZED_CUSTOMERS AS REAL_CUSTOMERS_PREVIOUS_YEAR,
p2.AFO_REALIZED_TURNOVER AS REAL_TURNOVER_PREVIOUS_YEAR
FROM ACT_FORECAST P
LEFT OUTER JOIN(SELECT DISTINCT p2.AFO_FORECAST_DATE
FROM ACT_FORECAST P2)
ON p2.AFO_FORECAST_DATE = p.AFO_FORECAST_DATE - 364
AND p2.AFO_SITE_ID = p.AFO_SITE_ID
AND p2.AFO_ACTIVITY_ID = p.AFO_ACTIVITY_ID
AND p2.AFO_SERVICE_ID = p.AFO_SERVICE_ID
WHERE
P.AFO_SITE_ID = :siteid
AND P.AFO_ACTIVITY_ID = :activityid
AND P.AFO_FORECAST_DATE BETWEEN :startdate AND :enddate
使用下面这样的东西:
SELECT P.AFO_ACTIVITY_ID,
P.AFO_SITE_ID,
P.AFO_FORECAST_DATE,
P.AFO_SERVICE_ID,
P.AFO_PLANNED_CUSTOMERS,
P.AFO_REALIZED_CUSTOMERS,
P.AFO_GROUP_CUSTOMERS,
P.AFO_PLANNED_TURNOVER,
P.AFO_REALIZED_TURNOVER,
P.AFO_GROUP_TURNOVER,
P.AFO_NB_EMPLOYEES,
P.AFO_TURNOVER_EMPLOYEES,
P.AFO_ID,
p2.AFO_REALIZED_CUSTOMERS AS REAL_CUSTOMERS_PREVIOUS_YEAR,
p2.AFO_REALIZED_TURNOVER AS REAL_TURNOVER_PREVIOUS_YEAR
FROM ACT_FORECAST P
LEFT OUTER JOIN(SELECT DISTINCT p2.AFO_FORECAST_DATE
FROM ACT_FORECAST P2)
ON p2.AFO_FORECAST_DATE = p.AFO_FORECAST_DATE - 364
AND p2.AFO_SITE_ID = p.AFO_SITE_ID
AND p2.AFO_ACTIVITY_ID = p.AFO_ACTIVITY_ID
AND p2.AFO_SERVICE_ID = p.AFO_SERVICE_ID
WHERE
P.AFO_SITE_ID = :siteid
AND P.AFO_ACTIVITY_ID = :activityid
AND P.AFO_FORECAST_DATE BETWEEN :startdate AND :enddate
您的
where
子句仅在指定范围内的p
中查找记录。如果没有,则没有要从中进行左外部联接的源行
您可以通过内联视图或CTE生成所查看期间的所有可能日期,然后查找与以下任一组日期匹配的记录:
WITH CTE (this_year, last_year) AS (
SELECT :startdate + level - 1, :startdate + level - 365
FROM dual
CONNECT BY level <= :enddate - :startdate + 1
)
SELECT
:activityid AS AFO_ACTIVITY_ID,
:siteid AS AFO_SITE_ID,
CTE.this_year AS AFO_FORECAST_DATE,
P.AFO_SERVICE_ID,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_PLANNED_CUSTOMERS END) AS AFO_PLANNED_CUSTOMERS,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_REALIZED_CUSTOMERS END) AS AFO_REALIZED_CUSTOMERS,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_GROUP_CUSTOMERS END) AS AFO_GROUP_CUSTOMERS,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_PLANNED_TURNOVER END) AS AFO_PLANNED_TURNOVER,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_REALIZED_TURNOVER END) AS AFO_REALIZED_TURNOVER,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_GROUP_TURNOVER END) AS AFO_GROUP_TURNOVER,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_NB_EMPLOYEES END) AS AFO_NB_EMPLOYEES,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_TURNOVER_EMPLOYEES END) AS AFO_TURNOVER_EMPLOYEES,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_ID END) AS AFO_ID,
MAX(CASE WHEN P.AFO_FORECAST_DATE = last_year
THEN P.AFO_REALIZED_CUSTOMERS END) AS REAL_CUSTOMERS_PREVIOUS_YEAR,
MAX(CASE WHEN P.AFO_FORECAST_DATE = last_year
THEN P.AFO_REALIZED_TURNOVER END) AS REAL_TURNOVER_PREVIOUS_YEAR
FROM
CTE
JOIN
ACT_FORECAST P
ON
P.AFO_FORECAST_DATE = CTE.this_year
OR
P.AFO_FORECAST_DATE = CTE.last_year
WHERE
P.AFO_SITE_ID = :siteid
AND P.AFO_ACTIVITY_ID = :activityid
GROUP BY
:activityid,
:siteid,
CTE.this_year,
P.AFO_SERVICE_ID;
尽管您可能需要比CTE
更具描述性的名称(使用任一版本…)
将样本数据作为CTE重新处理,问题中未显示的值为空:
with act_forecast (afo_activity_id, afo_site_id, afo_forecast_date, afo_service_id,
afo_planned_customers, afo_realized_customers, afo_group_customers,
afo_planned_turnover, afo_realized_turnover, afo_group_turnover,
afo_nb_employees, afo_turnover_employees, afo_id)
as (
select 1, 58, date '2018-02-01', 1, 0, 0, 0, 0, 11, 0, 0, 11, 2953773 from dual
union all select 1, 58, date '2017-02-02', 1, null, 0, null, null, 39.85, null, null, null, null from dual
union all select 1, 58, date '2018-02-01', 3, 345, 398, 0, 3467.25, 4052.01, 0, 0, 0, 2953774 from dual
union all select 1, 58, date '2017-02-02', 3, null, 328, null, null, 3291.53, null, null, null, null from dual
union all select 1, 58, date '2018-02-01', 5, 10, 16, 0, 140, 194.04, 0, 16, 60.9, 2953775 from dual
union all select 1, 58, date '2017-02-02', 5, null, 7, null, null, 91.12, null, null, null, null from dual
union all select 1, 58, date '2018-02-01', 7, 125, 151, 0, 1200, 1413.93, 0, 0, 0, 2953776 from dual
union all select 1, 58, date '2017-02-02', 7, null, 112, null, null, 1063.89, null, null, null, null from dual
)
然后在2018年的范围内:
AFO_ACTIVITY_ID AFO_SITE_ID AFO_FORECA AFO_SERVICE_ID AFO_PLANNED_CUSTOMERS AFO_REALIZED_CUSTOMERS AFO_GROUP_CUSTOMERS AFO_PLANNED_TURNOVER AFO_REALIZED_TURNOVER AFO_GROUP_TURNOVER AFO_NB_EMPLOYEES AFO_TURNOVER_EMPLOYEES AFO_ID REAL_CUSTOMERS_PREVIOUS_YEAR REAL_TURNOVER_PREVIOUS_YEAR
--------------- ----------- ---------- -------------- --------------------- ---------------------- ------------------- -------------------- --------------------- ------------------ ---------------- ---------------------- ---------- ---------------------------- ---------------------------
1 58 2018-02-01 3 345 398 0 3467.25 4052.01 0 0 0 2953774 328 3291.53
1 58 2018-02-01 7 125 151 0 1200 1413.93 0 0 0 2953776 112 1063.89
1 58 2018-02-01 1 0 0 0 0 11 0 0 11 2953773 0 39.85
1 58 2018-02-01 5 10 16 0 140 194.04 0 16 60.9 2953775 7 91.12
AFO_ACTIVITY_ID AFO_SITE_ID AFO_FORECA AFO_SERVICE_ID AFO_PLANNED_CUSTOMERS AFO_REALIZED_CUSTOMERS AFO_GROUP_CUSTOMERS AFO_PLANNED_TURNOVER AFO_REALIZED_TURNOVER AFO_GROUP_TURNOVER AFO_NB_EMPLOYEES AFO_TURNOVER_EMPLOYEES AFO_ID REAL_CUSTOMERS_PREVIOUS_YEAR REAL_TURNOVER_PREVIOUS_YEAR
--------------- ----------- ---------- -------------- --------------------- ---------------------- ------------------- -------------------- --------------------- ------------------ ---------------- ---------------------- ---------- ---------------------------- ---------------------------
1 58 2019-01-31 3 398 4052.01
1 58 2019-01-31 5 16 194.04
1 58 2019-01-31 1 0 11
1 58 2019-01-31 7 151 1413.93
2019年的范围为:
AFO_ACTIVITY_ID AFO_SITE_ID AFO_FORECA AFO_SERVICE_ID AFO_PLANNED_CUSTOMERS AFO_REALIZED_CUSTOMERS AFO_GROUP_CUSTOMERS AFO_PLANNED_TURNOVER AFO_REALIZED_TURNOVER AFO_GROUP_TURNOVER AFO_NB_EMPLOYEES AFO_TURNOVER_EMPLOYEES AFO_ID REAL_CUSTOMERS_PREVIOUS_YEAR REAL_TURNOVER_PREVIOUS_YEAR
--------------- ----------- ---------- -------------- --------------------- ---------------------- ------------------- -------------------- --------------------- ------------------ ---------------- ---------------------- ---------- ---------------------------- ---------------------------
1 58 2018-02-01 3 345 398 0 3467.25 4052.01 0 0 0 2953774 328 3291.53
1 58 2018-02-01 7 125 151 0 1200 1413.93 0 0 0 2953776 112 1063.89
1 58 2018-02-01 1 0 0 0 0 11 0 0 11 2953773 0 39.85
1 58 2018-02-01 5 10 16 0 140 194.04 0 16 60.9 2953775 7 91.12
AFO_ACTIVITY_ID AFO_SITE_ID AFO_FORECA AFO_SERVICE_ID AFO_PLANNED_CUSTOMERS AFO_REALIZED_CUSTOMERS AFO_GROUP_CUSTOMERS AFO_PLANNED_TURNOVER AFO_REALIZED_TURNOVER AFO_GROUP_TURNOVER AFO_NB_EMPLOYEES AFO_TURNOVER_EMPLOYEES AFO_ID REAL_CUSTOMERS_PREVIOUS_YEAR REAL_TURNOVER_PREVIOUS_YEAR
--------------- ----------- ---------- -------------- --------------------- ---------------------- ------------------- -------------------- --------------------- ------------------ ---------------- ---------------------- ---------- ---------------------------- ---------------------------
1 58 2019-01-31 3 398 4052.01
1 58 2019-01-31 5 16 194.04
1 58 2019-01-31 1 0 11
1 58 2019-01-31 7 151 1413.93
您的
where
子句仅在指定范围内的p
中查找记录。如果没有,则没有要从中进行左外部联接的源行
您可以通过内联视图或CTE生成所查看期间的所有可能日期,然后查找与以下任一组日期匹配的记录:
WITH CTE (this_year, last_year) AS (
SELECT :startdate + level - 1, :startdate + level - 365
FROM dual
CONNECT BY level <= :enddate - :startdate + 1
)
SELECT
:activityid AS AFO_ACTIVITY_ID,
:siteid AS AFO_SITE_ID,
CTE.this_year AS AFO_FORECAST_DATE,
P.AFO_SERVICE_ID,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_PLANNED_CUSTOMERS END) AS AFO_PLANNED_CUSTOMERS,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_REALIZED_CUSTOMERS END) AS AFO_REALIZED_CUSTOMERS,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_GROUP_CUSTOMERS END) AS AFO_GROUP_CUSTOMERS,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_PLANNED_TURNOVER END) AS AFO_PLANNED_TURNOVER,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_REALIZED_TURNOVER END) AS AFO_REALIZED_TURNOVER,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_GROUP_TURNOVER END) AS AFO_GROUP_TURNOVER,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_NB_EMPLOYEES END) AS AFO_NB_EMPLOYEES,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_TURNOVER_EMPLOYEES END) AS AFO_TURNOVER_EMPLOYEES,
MAX(CASE WHEN P.AFO_FORECAST_DATE = this_year
THEN P.AFO_ID END) AS AFO_ID,
MAX(CASE WHEN P.AFO_FORECAST_DATE = last_year
THEN P.AFO_REALIZED_CUSTOMERS END) AS REAL_CUSTOMERS_PREVIOUS_YEAR,
MAX(CASE WHEN P.AFO_FORECAST_DATE = last_year
THEN P.AFO_REALIZED_TURNOVER END) AS REAL_TURNOVER_PREVIOUS_YEAR
FROM
CTE
JOIN
ACT_FORECAST P
ON
P.AFO_FORECAST_DATE = CTE.this_year
OR
P.AFO_FORECAST_DATE = CTE.last_year
WHERE
P.AFO_SITE_ID = :siteid
AND P.AFO_ACTIVITY_ID = :activityid
GROUP BY
:activityid,
:siteid,
CTE.this_year,
P.AFO_SERVICE_ID;
尽管您可能需要比CTE
更具描述性的名称(使用任一版本…)
将样本数据作为CTE重新处理,问题中未显示的值为空:
with act_forecast (afo_activity_id, afo_site_id, afo_forecast_date, afo_service_id,
afo_planned_customers, afo_realized_customers, afo_group_customers,
afo_planned_turnover, afo_realized_turnover, afo_group_turnover,
afo_nb_employees, afo_turnover_employees, afo_id)
as (
select 1, 58, date '2018-02-01', 1, 0, 0, 0, 0, 11, 0, 0, 11, 2953773 from dual
union all select 1, 58, date '2017-02-02', 1, null, 0, null, null, 39.85, null, null, null, null from dual
union all select 1, 58, date '2018-02-01', 3, 345, 398, 0, 3467.25, 4052.01, 0, 0, 0, 2953774 from dual
union all select 1, 58, date '2017-02-02', 3, null, 328, null, null, 3291.53, null, null, null, null from dual
union all select 1, 58, date '2018-02-01', 5, 10, 16, 0, 140, 194.04, 0, 16, 60.9, 2953775 from dual
union all select 1, 58, date '2017-02-02', 5, null, 7, null, null, 91.12, null, null, null, null from dual
union all select 1, 58, date '2018-02-01', 7, 125, 151, 0, 1200, 1413.93, 0, 0, 0, 2953776 from dual
union all select 1, 58, date '2017-02-02', 7, null, 112, null, null, 1063.89, null, null, null, null from dual
)
然后在2018年的范围内:
AFO_ACTIVITY_ID AFO_SITE_ID AFO_FORECA AFO_SERVICE_ID AFO_PLANNED_CUSTOMERS AFO_REALIZED_CUSTOMERS AFO_GROUP_CUSTOMERS AFO_PLANNED_TURNOVER AFO_REALIZED_TURNOVER AFO_GROUP_TURNOVER AFO_NB_EMPLOYEES AFO_TURNOVER_EMPLOYEES AFO_ID REAL_CUSTOMERS_PREVIOUS_YEAR REAL_TURNOVER_PREVIOUS_YEAR
--------------- ----------- ---------- -------------- --------------------- ---------------------- ------------------- -------------------- --------------------- ------------------ ---------------- ---------------------- ---------- ---------------------------- ---------------------------
1 58 2018-02-01 3 345 398 0 3467.25 4052.01 0 0 0 2953774 328 3291.53
1 58 2018-02-01 7 125 151 0 1200 1413.93 0 0 0 2953776 112 1063.89
1 58 2018-02-01 1 0 0 0 0 11 0 0 11 2953773 0 39.85
1 58 2018-02-01 5 10 16 0 140 194.04 0 16 60.9 2953775 7 91.12
AFO_ACTIVITY_ID AFO_SITE_ID AFO_FORECA AFO_SERVICE_ID AFO_PLANNED_CUSTOMERS AFO_REALIZED_CUSTOMERS AFO_GROUP_CUSTOMERS AFO_PLANNED_TURNOVER AFO_REALIZED_TURNOVER AFO_GROUP_TURNOVER AFO_NB_EMPLOYEES AFO_TURNOVER_EMPLOYEES AFO_ID REAL_CUSTOMERS_PREVIOUS_YEAR REAL_TURNOVER_PREVIOUS_YEAR
--------------- ----------- ---------- -------------- --------------------- ---------------------- ------------------- -------------------- --------------------- ------------------ ---------------- ---------------------- ---------- ---------------------------- ---------------------------
1 58 2019-01-31 3 398 4052.01
1 58 2019-01-31 5 16 194.04
1 58 2019-01-31 1 0 11
1 58 2019-01-31 7 151 1413.93
2019年的范围为:
AFO_ACTIVITY_ID AFO_SITE_ID AFO_FORECA AFO_SERVICE_ID AFO_PLANNED_CUSTOMERS AFO_REALIZED_CUSTOMERS AFO_GROUP_CUSTOMERS AFO_PLANNED_TURNOVER AFO_REALIZED_TURNOVER AFO_GROUP_TURNOVER AFO_NB_EMPLOYEES AFO_TURNOVER_EMPLOYEES AFO_ID REAL_CUSTOMERS_PREVIOUS_YEAR REAL_TURNOVER_PREVIOUS_YEAR
--------------- ----------- ---------- -------------- --------------------- ---------------------- ------------------- -------------------- --------------------- ------------------ ---------------- ---------------------- ---------- ---------------------------- ---------------------------
1 58 2018-02-01 3 345 398 0 3467.25 4052.01 0 0 0 2953774 328 3291.53
1 58 2018-02-01 7 125 151 0 1200 1413.93 0 0 0 2953776 112 1063.89
1 58 2018-02-01 1 0 0 0 0 11 0 0 11 2953773 0 39.85
1 58 2018-02-01 5 10 16 0 140 194.04 0 16 60.9 2953775 7 91.12
AFO_ACTIVITY_ID AFO_SITE_ID AFO_FORECA AFO_SERVICE_ID AFO_PLANNED_CUSTOMERS AFO_REALIZED_CUSTOMERS AFO_GROUP_CUSTOMERS AFO_PLANNED_TURNOVER AFO_REALIZED_TURNOVER AFO_GROUP_TURNOVER AFO_NB_EMPLOYEES AFO_TURNOVER_EMPLOYEES AFO_ID REAL_CUSTOMERS_PREVIOUS_YEAR REAL_TURNOVER_PREVIOUS_YEAR
--------------- ----------- ---------- -------------- --------------------- ---------------------- ------------------- -------------------- --------------------- ------------------ ---------------- ---------------------- ---------- ---------------------------- ---------------------------
1 58 2019-01-31 3 398 4052.01
1 58 2019-01-31 5 16 194.04
1 58 2019-01-31 1 0 11
1 58 2019-01-31 7 151 1413.93
如果我理解正确,您可以使用
完全外部联接
:
SELECT
COALESCE(P.AFO_ACTIVITY_ID, P2.AFO_ACTIVITY_ID) as AFO_ACTIVITY_ID,
COALESCE(P.AFO_SITE_ID, P2.AFO_SITE_ID) as AFO_SITE_ID,
P.AFO_FORECAST_DATE,
P.AFO_SERVICE_ID,
P.AFO_PLANNED_CUSTOMERS,
P.AFO_REALIZED_CUSTOMERS,
P.AFO_GROUP_CUSTOMERS,
P.AFO_PLANNED_TURNOVER,
P.AFO_REALIZED_TURNOVER,
P.AFO_GROUP_TURNOVER,
P.AFO_NB_EMPLOYEES,
P.AFO_TURNOVER_EMPLOYEES,
P.AFO_ID,
p2.AFO_REALIZED_CUSTOMERS AS REAL_CUSTOMERS_PREVIOUS_YEAR,
p2.AFO_REALIZED_TURNOVER AS REAL_TURNOVER_PREVIOUS_YEAR
FROM (SELECT P.*
FROM ACT_FORECAST P
WHERE P.AFO_SITE_ID = :siteid AND
P.AFO_ACTIVITY_ID = :activityid AND
P.AFO_FORECAST_DATE BETWEEN :startdate AND :enddate
) P FULL JOIN
(SELECT p2.*
FROM act_forecast p2
WHERE P2.AFO_SITE_ID = :siteid AND
P2.AFO_ACTIVITY_ID = :activityid AND
P2.AFO_FORECAST_DATE BETWEEN :startdate - 364 AND :enddate - 364
) p2
ON p2.AFO_FORECAST_DATE = p.AFO_FORECAST_DATE - 364 AND
p2.AFO_SITE_ID = p.AFO_SITE_ID AND
p2.AFO_ACTIVITY_ID = p.AFO_ACTIVITY_ID AND
p2.AFO_SERVICE_ID = p.AFO_SERVICE_ID
如果我理解正确,您可以使用
完全外部联接
:
SELECT
COALESCE(P.AFO_ACTIVITY_ID, P2.AFO_ACTIVITY_ID) as AFO_ACTIVITY_ID,
COALESCE(P.AFO_SITE_ID, P2.AFO_SITE_ID) as AFO_SITE_ID,
P.AFO_FORECAST_DATE,
P.AFO_SERVICE_ID,
P.AFO_PLANNED_CUSTOMERS,
P.AFO_REALIZED_CUSTOMERS,
P.AFO_GROUP_CUSTOMERS,
P.AFO_PLANNED_TURNOVER,
P.AFO_REALIZED_TURNOVER,
P.AFO_GROUP_TURNOVER,
P.AFO_NB_EMPLOYEES,
P.AFO_TURNOVER_EMPLOYEES,
P.AFO_ID,
p2.AFO_REALIZED_CUSTOMERS AS REAL_CUSTOMERS_PREVIOUS_YEAR,
p2.AFO_REALIZED_TURNOVER AS REAL_TURNOVER_PREVIOUS_YEAR
FROM (SELECT P.*
FROM ACT_FORECAST P
WHERE P.AFO_SITE_ID = :siteid AND
P.AFO_ACTIVITY_ID = :activityid AND
P.AFO_FORECAST_DATE BETWEEN :startdate AND :enddate
) P FULL JOIN
(SELECT p2.*
FROM act_forecast p2
WHERE P2.AFO_SITE_ID = :siteid AND
P2.AFO_ACTIVITY_ID = :activityid AND
P2.AFO_FORECAST_DATE BETWEEN :startdate - 364 AND :enddate - 364
) p2
ON p2.AFO_FORECAST_DATE = p.AFO_FORECAST_DATE - 364 AND
p2.AFO_SITE_ID = p.AFO_SITE_ID AND
p2.AFO_ACTIVITY_ID = p.AFO_ACTIVITY_ID AND
p2.AFO_SERVICE_ID = p.AFO_SERVICE_ID
添加一些示例表数据和预期结果-作为格式化文本,而不是图像。但是首先看一看,
where子句
与任何内容都不匹配,因此没有P
行从左连接。如果存在匹配的P
行,但没有匹配的P2
行,则外部联接将返回数据。我尝试使用右外部联接使P2匹配行,但它不返回任何内容。我们仍然需要样本数据来建议更好的方法。目前尚不清楚您搜索的时间段有多大,也不清楚您是在查找前一年同一时间段的所有数据,还是只查找恰好匹配的天数(这是您现在看到的)。添加了示例,对于延迟表示抱歉。一个月内,我最多可以有124行(每天4个服务),但该表包含当前年份和2年存档的所有餐厅的数据。添加一些示例表数据和预期结果-作为格式化文本,而不是图像。但是首先看一看,where子句
与任何内容都不匹配,因此没有P
行从左连接。如果存在匹配的P
行,但没有匹配的P2
行,则外部联接将返回数据。我尝试使用右外部联接使P2匹配行,但它不返回任何内容。我们仍然需要样本数据来建议更好的方法。目前尚不清楚您搜索的时间段有多大,也不清楚您是在查找前一年同一时间段的所有数据,还是只查找恰好匹配的天数(这是您现在看到的)。添加了示例,对于延迟表示抱歉。对于一个月,我最多可以有124行(每天4个服务),但该表包含了当前年份和2年存档的所有餐厅的数据。其中-364用于比较前一年的同一天(例如周一和周一)。解释很好,在这里附近的某个地方发现了窍门^^间隔1年并不更合适。但是,谢谢你,我学到了一些东西(我希望永远都不需要),我把错误的答案留给了其他人,让他们不要犯同样的错误。Oracle date算术使用天数,所以-364比这早了很多天。您的interval版本是等效的、更简洁的,在Oracle中也可以使用。interval 1年:2018年2月1日星期二->2017年2月1日星期三-364年:2018年2月1日星期二->2017年2月2日星期二我需要第二个版本来比较一个人可以做的相同“天”-interval 1年+interval 1天
,但我明白了。然而,二月前后的闰年让我提到了年份,-364用于比较前一年的同一天(例如周一和周一)。解释很好,在这里附近的某个地方发现了窍门^^间隔1年并不更合适。但是谢谢,我学到了一些东西(我希望永远都不需要),我把错误的答案留给别人,让他们不要犯同样的错误