在多列上使用空值进行外部联接
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;
您可能会发现将子查询另存为单独的查询定义更容易,从而使您的主查询更具可读性。
我正在尝试像 运行 总数那样计算某事,但我无法对不在基线中的类型进行计算。这是我的简化数据表:
╔══════════╦═══════╦══════╦═════════╗
║ 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;
您可能会发现将子查询另存为单独的查询定义更容易,从而使您的主查询更具可读性。