【发布时间】:2018-07-06 11:13:36
【问题描述】:
我有一个 T-SQL 语句应该执行 Full OUTER JOIN。
我将调用原始选择语句table1,我将调用连接表table2。
我的查询没有返回 table2 中唯一的值。更具体地说,它不会返回 table2 具有不在 table1 中的 segValue1 或 segValue2 的行。 (即它错误地认为连接是LEFT JOIN 而不是FULL OUTER JOIN)。
我不知道为什么会这样。为什么这会表现得好像是左连接?
基本上发生的情况是,如果帐户没有活动/Actuals 表中不存在,那么它就不会被提取。
以下是表 A、表 B、当前结果表和期望结果表的示例:
Table Actual (SQL Server table with Actuals)
company segValue1 segValue2 ActualsAmount FiscalYear FiscalPeriod
NVV 5000 000 $20 2017 12
NVV 6000 111 $100 2017 12
NVV 8000 333 $40 2017 12
NVV 4000 555 $200 2017 12
Table Budget (SQL Server table with Budgets)
company segValue1 segValue2 BudgetAmt BalanceType FiscalYear FiscalPeriod
NVV 5000 000 $10 D 2017 12
NVV 2000 111 $50 D 2017 12
NVV 8000 444 $90 D 2017 12
NVV 4000 555 $60 D 2017 12
Table that the current, erroneous Code is producing.
Notice it is skipping records 2 and 3 from Table B because it is not in Table A:
company segValue1 segValue2 ActualsAmount BudgetAmt
NVV 5000 000 $20 $10
NVV 6000 111 $100 NULL
NVV 8000 333 $40 NULL
NVV 8000 333 $40 NULL
NVV 4000 555 $200 $60
Desired Result Table:
company segValue1 segValue2 ActualsAmount BudgetAmt
NVV 5000 000 $20 $10
NVV 6000 111 $100 NULL
NVV 2000 111 NULL $50 --<-correct
NVV 8000 444 NULL $90 --<-correct
NVV 8000 333 $40 NULL
NVV 4000 555 $200 $60
代码如下:
SELECT
A.Company,
A.segvalue1, A.segvalue2,
APYY.BalanceAmtBYTD, APYY.BalanceAmtBM,
SUM(CASE
WHEN FiscalPeriod BETWEEN '1' AND '12' AND FiscalYear = '2017'
THEN ActualsAmount
ELSE NULL
END) AS BalanceAmtCYTD,
SUM(CASE
WHEN FiscalPeriod = '12' AND FiscalYear = '2017'
THEN ActualsAmount
ELSE NULL
END) AS BalanceAmtCYM
FROM
Actual A
FULL OUTER JOIN
(SELECT
B.Company, B.segvalue1, B.segvalue2,
SUM(CASE WHEN FiscalPeriod BETWEEN '1' AND '12' AND FiscalYear = '2017' THEN BudgetAmt ELSE NULL END) as BalanceAmtBYTD,
SUM(CASE WHEN FiscalPeriod = '12' AND FiscalYear = '2017' THEN BudgetAmt ELSE NULL END) as BalanceAmtBM
FROM
Budget B
WHERE
FiscalYear = '2017'
AND BalanceType LIKE '%D%'
GROUP BY
B.Company,
B.segvalue1, B.segvalue2 ) APYY ON (A.Company = APYY.Company
AND A.segvalue1 = APYY.segvalue1
AND A.segvalue2 = APYY.segvalue2)
WHERE
A.Company = 'NVV'
GROUP BY
A.Company, A.segvalue1, A.segvalue2,
APYY.BalanceAmtBYTD, APYY.BalanceAmtBM
【问题讨论】:
-
我当然还没有见过“像棒球棒一样打我的脸”的东西!
-
尝试将两个表都放入临时表,然后进行完全联接。
-
任何反对外连接的地方都会排除行。 GLJ 在一家公司被过滤,APPY 在另一家公司被过滤
-
无会计期间。我放弃。你没有实际测试过这个。
-
查询仍然没有在发布的数据上运行。您在分解问题和编写问题陈述时遇到了问题。
标签: sql-server tsql full-outer-join