在没有值的情况下,我使用outer join
来空白行,但是为什么忽略行并获取所有日期
AND t.TradeDate BETWEEN @firstOfMonth AND @maxTradeDate
如果我将AND
更改为WHERE
,则可以,但是我丢失了需要清零的行
--DAILY
SELECT
a.[Name] AS RepName,
CONVERT(VARCHAR, a.TradeDate, 107) AS TimePeriod,
ISNULL(SUM(CASE t.CancelCode
WHEN '1' THEN t.Quantity * -1
ELSE t.Quantity
END), 0) AS Quantity,
ISNULL(SUM(CASE t.CancelCode
WHEN '1' THEN t.Principal * -1
ELSE t.Principal
END), 0) AS Principal,
ISNULL(SUM(CASE t.CancelCode
WHEN '1' THEN t.TradeConcession * -1
ELSE t.TradeConcession
END), 0) AS Comm,
1 AS TheOrder
FROM
dayreps a
LEFT JOIN
Trades t ON a.TradeDate = t.TradeDate
AND a.RepID = t.RepID
AND t.TradeDate BETWEEN @firstOfMonth AND @maxTradeDate
GROUP BY
a.[Name], a.TradeDate
答案 0 :(得分:1)
通过在OUTER JOIN
的{{1}}子句中包含条件,您是说不符合此条件不能排除左表(ON
)中的行。而是将这些行为NULL,就像其他连接条件失败的行一样。
因此,原则上将条件移至dayreps
子句是正确的,但是您还必须注意条件的含义。如果你放
WHERE
在t.TradeDate BETWEEN @firstOfMonth AND @maxTradeDate
子句中,如果日期超出范围,或者是WHERE
-NULL
对于外部联接为空的任何行。
幸运的是,您可以改用
t.TransDate
,并且由于这来自您的左表,因此将其放在a.TradeDate BETWEEN @firstOfMonth AND @maxTradeDate
子句中不会阻止外部联接。
答案 1 :(得分:-1)
我相信是通过LEFT JOIN进行的,因为LEFT JOIN如果存在匹配项,则独立地从第一个表中获取所有记录,在这种情况下,第一个表是dayreps。
尝试使用内部联接
SELECT
a.[Name] AS RepName,
CONVERT(VARCHAR, a.TradeDate, 107) AS TimePeriod,
ISNULL(SUM(CASE t.CancelCode
WHEN '1'
THEN t.Quantity * -1
ELSE t.Quantity
END), 0) AS Quantity,
ISNULL(SUM(CASE t.CancelCode
WHEN '1'
THEN t.Principal * -1
ELSE t.Principal
END), 0) AS Principal,
ISNULL(SUM(CASE t.CancelCode
WHEN '1'
THEN t.TradeConcession * -1
ELSE t.TradeConcession
END), 0) AS Comm,
1 AS TheOrder
FROM dayreps a
INNER JOIN Trades t ON a.TradeDate = t.TradeDate and a.RepID = t.RepID
AND t.TradeDate BETWEEN @firstOfMonth AND @maxTradeDate
GROUP BY a.[Name],
a.TradeDate
选中此What is the difference between "INNER JOIN" and "OUTER JOIN"?
PD:对不起,我的英语,我在此工作=)