外连接在多列上具有Null值

时间:2015-02-26 19:45:31

标签: ms-access

我试图像运行总计一样计算某些东西,但是我不能让这个对不在基线中的类型起作用。这是我简化的数据表:

╔══════════╦═══════╦══════╦═════════╗
║   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的正确数据,但不会返回type = 2016的任何内容。我想因为我做了LEFT JOIN它应该返回t1中的所有值,只返回t2那里的值,并且NZ还会处理空值。

有人可以指出我正确的方向并告诉我哪里出错了

1 个答案:

答案 0 :(得分:1)

您需要使用subqueries。在左连接表上指定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;

您可能会发现将子查询保存为单独的查询def更容易,以使您的主查询更具可读性。