有人可以解释一下这个 SQL 左连接行为以获取以前的值



我试图理解为什么查询的行为方式如此。我有一个包含客户、收入、销售年份和销售学期的表格。我想通过自加入表来查找上一年的收入。我精通使用 LAG,我不是在寻找替代解决方案,只是有人可以明确解释为什么以下内容有效。这是一个临时表,一个客户帐户以保持简单。联接是客户、年份和学期的自左联接。在连接中,它是 c.SaleYear = p.SaleYear + 1。加 1 允许返回以前的记录,查看它时并不直观。如果有人可以解释一下这是如何工作的:

CREATE TABLE #Sales (
     CustomerNumber int
    ,SaleYear int
    ,SaleSemester int
    ,Revenue decimal(7,2) );
INSERT INTO #Sales
SELECT 123, 2012, 1, 18.00;
INSERT INTO #Sales
SELECT 123, 2012, 1, 19.00;
INSERT INTO #Sales
SELECT 123, 2014, 3, 13.00;
INSERT INTO #Sales
SELECT 123, 2015, 2, 31.00;
INSERT INTO #Sales
SELECT 123, 2015, 3, 27.00;
INSERT INTO #Sales
SELECT 123, 2016, 2, 92.00;
INSERT INTO #Sales
SELECT 123, 2017, 3, 10.00;
-- Begin query
SELECT 
     c.CustomerNumber
    ,c.SaleYear
    ,c.SaleSemester
    ,c.Revenue AS Revenue
    ,ISNULL(p.Revenue, 0) AS PreviousRevenue
    ,p.SaleYear AS PreviousYear
    ,p.SaleSemester AS PreviousSemester
FROM #Sales c
LEFT JOIN #Sales p ON c.CustomerNumber = p.CustomerNumber AND c.SaleYear = p.SaleYear + 1 AND c.SaleSemester = p.SaleSemester 

它只是匹配记录,其中 p.SaleYear 比 c.SaleYear 少一个。也就是说,如果 p.SaleYear 是 2016 年,c.SaleYear 是 2017,那么 p.SaleYear + 1 = c.SaleYear。因此,您可以通过在他们的年份中添加 1 而不是从当前年份的记录中减去 1 来查找上一年的记录。

或者你可以这样想。where 子句中的每个条件本质上都是它所比较的一对表达式:

(表达式 1) = (表达式 2)

如果该比较的结果为真,则将其视为匹配。所以在你的查询中你有

(c.销售年份) = (p.销售年份 + 1)

将计算

两个表达式,当比较的两边计算结果为相同的值时,将找到匹配项。或者使用我之前的例子:

(2017) = (2016 + 1)

最新更新