在多列上使用空值进行外部联接

Outer Joins with Null values on Multiple columns

我正在尝试像 运行 总数那样计算某事,但我无法对不在基线中的类型进行计算。这是我的简化数据表:

╔══════════╦═══════╦══════╦═════════╗
║   Date   ║ store ║ type ║ LTD_PnL ║
╠══════════╬═══════╬══════╬═════════╣
║ 20141230 ║ ABC   ║ 2015 ║      10 ║
║ 20150102 ║ ABC   ║ 2015 ║      20 ║
║ 20150102 ║ ABC   ║ 2016 ║      22 ║
║ 20150103 ║ ABC   ║ 2015 ║      23 ║
║ 20150103 ║ ABC   ║ 2016 ║      23 ║
╚══════════╩═══════╩══════╩═════════╝

现在我想以 20141230 为基准计算 YTD PnL。这是我希望得到的输出:

╔══════════╦═══════╦══════╦═════════╗
║   Date   ║ store ║ type ║ YTD_PnL ║
╠══════════╬═══════╬══════╬═════════╣
║ 20150102 ║ ABC   ║ 2015 ║      10 ║
║ 20150102 ║ ABC   ║ 2016 ║      22 ║
║ 20150103 ║ ABC   ║ 2015 ║      13 ║
║ 20150103 ║ ABC   ║ 2016 ║      23 ║
╚══════════╩═══════╩══════╩═════════╝

这是我的 MS Access SQL:

select 
 t1.Date, t1.store, t1.type, 
 SUM(t1.LTD_PnL) - SUM(NZ(t2.LTD_PnL,0)) AS YTD_PnL
from PnLTable AS t1 LEFT JOIN PnLTable AS t2 ON t1.store=t2.store AND t1.type = t2.type
Where t1.Date >"20141230" AND t2.Date = "20141230"
GROUP BY t1.Date, t1.store, t1.type;

这会输出 type=2015 的正确数据,但不会 return type=2016 的任何数据。我想因为我做了一个 LEFT JOIN 它应该 return t1 中的所有值并且只有那些存在于 t2 的值并且 NZ 会处理空值。

有人能给我指出正确的方向并告诉我哪里出错了吗

您需要使用 subqueries。当您在左联接 table 上指定 WHERE 子句时,Jet/ACE(Access 数据库引擎)本质上将其视为 INNER JOIN。

试试这个:

select 
 t1.Date, t1.store, t1.type, 
 SUM(t1.LTD_PnL) - SUM(NZ(t2.LTD_PnL,0)) AS YTD_PnL
from PnLTable AS t1 LEFT JOIN 
  (SELECT store, type, LTD_PnL FROM PnLTable WHERE PnLTable.Date="20141230") AS t2 
  ON t1.store=t2.store AND t1.type = t2.type
Where t1.Date >"20141230"
GROUP BY t1.Date, t1.store, t1.type;

您可能会发现将子查询另存为单独的查询定义更容易,从而使您的主查询更具可读性。