【发布时间】:2015-06-18 11:22:50
【问题描述】:
我有两张表如下:
loy_credits_ledger
+-----------------+------------------+--------- -----+-----------------+ | CRL_OUTLET_CODE | CRL_REDEEM_MONTH | crl_redeem_year | CRL_RM_REDEEMED | +-----------------+------+------------ -----+-----------------+ | 144000581 |四月 | 2014 | 273.3 | | 144000581 |七月 | 2014 | 194.1 | | 144000581 |华侨城 | 2014 | 216.3 | | 144000581 |一月 | 2015 | 24.9 | | 144000581 |一月 | 2015 | 177.1 | +-----------------+------+------------ -----+-----------------+
jti_qtr_credit_data
+------+----------+-------------+--- ---------+------------+----------+ | QCD_OUTLET_CODE | QCD_YEAR | QCD_季度 | QCD_CREDIT | QCD_POINTS | QCD_CREDITS_BALANCE | +-----------------+----------+-------------+------ ------+------------+----------+ | 144000581 | 2014 |第一季度 | 273.3 | 54660 | 0 | | 144000581 | 2014 | Q2 | 194.1 | 38820 | 0 | | 144000581 | 2014 |第三季度 | 378.8 | 75760 | 0 | | 144000581 | 2014 |第四季度 | 202 | 40400 | 0 | | 144000581 | 2015 |第一季度 | 321.55 | 64310 | 0 | +-----------------+----------+-------------+------ ------+------------+----------+
我需要在某些条件下加入这两个表。除了凌乱的表格结构(我无法控制)之外,我设法让我的结果几乎正确。基本上,这是我的目标:
+------+----------+-------------+--- ---------+------------+--------------+------------ ---------+ | QCD_OUTLET_CODE | QCD_YEAR | QCD_季度 | QCD_POINTS | QCD_CREDIT | QCD_REDEEMED | QCD_CREDITS_BALANCE | +-----------------+----------+-------------+------ ------+------------+--------------+--------------- ------+ | 144000581 | 2014 | Q2 | 38820 | 194.1 | 194.1 | 0 | | 144000581 | 2014 |第四季度 | 40400 | 202 | 202 | 0 | | 144000581 | 2014 |第一季度 | 54660 | 273.3 | 273.3 | 0 | | 144000581 | 2014 |第三季度 | 75760 | 378.8 | 216.3 | 162.5 | +-----------------+----------+-------------+------ ------+------------+--------------+--------------- ------+
只是缺少第五条记录,仅存在于jti_qtr_credit_data中。
我使用脚本做到了:
SELECT Q.QCD_OUTLET_CODE, Q.QCD_YEAR, Q.QCD_QUARTER, Q.QCD_POINTS, Q.QCD_CREDIT, nvl(SUM(L.REDEEMED), 0) AS QCD_REDEEMED, Q.QCD_CREDIT - NVL(SUM(L.REDEEMED),0) AS QCD_CREDITS_BALANCE
FROM
(SELECT
(case when CRL_REDEEM_MONTH = 'JAN' Then 'Q4'
when CRL_REDEEM_MONTH = 'FEB' Then 'Q4'
when CRL_REDEEM_MONTH = 'MAR' Then 'Q4'
when CRL_REDEEM_MONTH = 'APR' Then 'Q1'
when CRL_REDEEM_MONTH = 'MAY' Then 'Q1'
when CRL_REDEEM_MONTH = 'JUN' Then 'Q1'
when CRL_REDEEM_MONTH = 'JUL' Then 'Q2'
when CRL_REDEEM_MONTH = 'AUG' Then 'Q2'
when CRL_REDEEM_MONTH = 'SEP' Then 'Q2'
when CRL_REDEEM_MONTH = 'OCT' Then 'Q3'
when CRL_REDEEM_MONTH = 'NOV' Then 'Q3'
when CRL_REDEEM_MONTH = 'DEC' Then 'Q3'
ELSE NULL END) QUARTER,
(case
when CRL_REDEEM_MONTH = 'JAN' Then crl_redeem_year-1
when CRL_REDEEM_MONTH = 'FEB' Then crl_redeem_year-1
when CRL_REDEEM_MONTH = 'MAR' Then crl_redeem_year-1
when CRL_REDEEM_MONTH = 'APR' Then crl_redeem_year
when CRL_REDEEM_MONTH = 'MAY' Then crl_redeem_year
when CRL_REDEEM_MONTH = 'JUN' Then crl_redeem_year
when CRL_REDEEM_MONTH = 'JUL' Then crl_redeem_year
when CRL_REDEEM_MONTH = 'AUG' Then crl_redeem_year
when CRL_REDEEM_MONTH = 'SEP' Then crl_redeem_year
when CRL_REDEEM_MONTH = 'OCT' Then crl_redeem_year
when CRL_REDEEM_MONTH = 'NOV' Then crl_redeem_year
when CRL_REDEEM_MONTH = 'DEC' Then crl_redeem_year
ELSE NULL END) redeem_year,
CRL_OUTLET_CODE, CRL_CREDITS_EARNED, NVL(CRL_RM_REDEEMED, 0) REDEEMED
FROM loy_credits_ledger
where TO_CHAR(crl_redeem_year) is not null
AND CRL_OUTLET_CODE = 144000581
--GROUP BY CRL_REDEEM_MONTH, crl_redeem_year, CRL_OUTLET_CODE, CRL_CREDITS_EARNED
) L
full outer JOIN jti_qtr_credit_data Q
ON L.CRL_OUTLET_CODE = Q.QCD_OUTLET_CODE
AND L.redeem_year = Q.QCD_YEAR
AND L.QUARTER = Q.QCD_QUARTER
AND L.CRL_OUTLET_CODE = 144000581
GROUP BY Q.QCD_OUTLET_CODE, Q.QCD_YEAR, Q.QCD_QUARTER, Q.QCD_YEAR, Q.QCD_CREDIT, Q.QCD_POINTS;
现在,问题是,我尝试了 left 和 right 加入。因为我在 jti_qtr_credit_data 中有 QCD_Quarter = Q1 & QCD_Year = 2015 的记录,但在 loy_credits_ledger 中没有;不应该仍然显示带有左或右连接的空值的记录?
这个问题和join的子查询有关系吗?
【问题讨论】:
-
当 OUTER JOIN 时,(通常)所有条件都应该在 ON 子句中,而不是在 WHERE 子句中。
-
@jarlh 如果你指的是
WHERE CRL_OUTLET_CODE = 144000581,我添加了这个来测试一个研究案例。我在每个表中有数百条记录 -
是的,那个,把它放在ON子句里! (在 WHERE 中,该连接作为常规内部连接执行。)
-
@jarlh 我更新了我的脚本。谢谢,我不知道。但仍然给我同样的结果
标签: sql join oracle11g subquery