2

我本质上是在尝试修改这个存储过程。

修改后的存储过程:

CREATE PROCEDURE sp1(d1 date, d2 date, client INT(10))
    declare d datetime;

    create TEMPORARY TABLE foo (d date NOT NULL, Amount INT(10) DEFAULT 0);

    set d = d1;

    while d <= d2 do 
        insert into foo (d) values (d);
        set d = date_add(d, interval 1 day);
    end while;

    SELECT SUM(p.Amount), foo.d
    FROM foo LEFT JOIN ItemTracker_dbo.Payment ON foo.d = p.Datetime
    WHERE p.ClientId = ClientId
    GROUP BY
        foo.d;

    DROP TEMPORARY TABLE foo;
end PROCEDURE

注意: WHERE 子句... p.ClientId = client

我绞尽脑汁想弄清楚为什么它忽略了零。

删除WHERE p.ClientId = client程序后开始返回NULL...

为什么 WHERE 子句省略空行?我可能误解了a到底LEFT JOIN是什么。

如何过滤SUM(p.Amount)结果以仅返回总和WHERE clientId = client

4

4 回答 4

4

首先,是不是你的示例代码

SELECT SUM(p.Amount), foo.d 
    FROM foo LEFT JOIN ItemTracker_dbo.Payment ON foo.d = p.Datetime 
    WHERE p.ClientId = ClientId 
    GROUP BY 
        foo.d; 

缺少p 表的别名ItemTracker_dbo.Payment ??即,不应该这样写:

SELECT SUM(p.Amount), foo.d 
    FROM foo 
       LEFT JOIN ItemTracker_dbo.Payment p
            ON foo.d = p.Datetime 
WHERE p.ClientId = ClientId 
GROUP BY foo.d; 

无论如何,您遇到此问题的原因是 where 子句条件在处理外连接之后才应用(从外侧添加回的行)因此您需要将 where 条件移动到连接条件中:

SELECT SUM(p.Amount), foo.d 
    FROM foo 
       LEFT JOIN ItemTracker_dbo.Payment p
            ON foo.d = p.Datetime 
                And p.ClientId = ClientId 
GROUP BY foo.d; 
于 2010-02-02T16:11:37.390 回答
3

如果您将所有条件放入LEFT JOIN条件中,它应该可以工作:

SELECT SUM(p.Amount), foo.d
FROM foo
LEFT JOIN ItemTracker_dbo.Payment p ON foo.d = p.Datetime AND p.ClientId = ClientId
GROUP BY
    foo.d;
于 2010-02-02T16:10:22.443 回答
2

WHERE子句移动到ON子句中,如下所示:

SELECT SUM(p.Amount), foo.d
FROM foo LEFT JOIN ItemTracker_dbo.Payment ON foo.d = p.Datetime 
    and p.ClientId = ClientId
GROUP BY
    foo.d;

通过将 ClientId 比较放在 WHERE 子句中,您实际上将LEFT JOINback 变成了INNER JOINon ClientId

于 2010-02-02T16:10:56.610 回答
0

问题是 = 运算符在 SQL 中不是 NULL 安全的。NULL = NULL是假的。你必须使用 NULL 安全的等价物,如果我没记错的话,它是<=>在 MySQL 上的。您也可以使用该COALESCE函数或写a=b(a=b OR a IS NULL or b IS NULL).

于 2010-02-02T16:10:56.363 回答