我试图像运行总计一样计算某些东西,但是我不能让这个对不在基线中的类型起作用。这是我简化的数据表:
╔══════════╦═══════╦══════╦═════════╗
║ 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还会处理空值。
有人可以指出我正确的方向并告诉我哪里出错了
答案 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更容易,以使您的主查询更具可读性。