Sql 使用左连接计数记录

Sql 使用左连接计数记录,sql,sql-server,Sql,Sql Server,我正试图计算每种状态登记的账单数量。对于那些没有匹配项的状态,显示0 当我在不使用任何WHERE子句的情况下使用LEFT JOIN时,它可以完美地工作: SELECT bs.name 'status', count(b.StatusId) 'quantity' FROM BillStatus bs LEFT JOIN Bill b on b.StatusID = bs.Id GROUP BY bs.name 但当我添加WHERE子句时,它只显示具有匹配项的状态(“Pendente”状态缺失)

我正试图计算每种状态登记的账单数量。对于那些没有匹配项的状态,显示0

当我在不使用任何
WHERE
子句的情况下使用
LEFT JOIN
时,它可以完美地工作:

SELECT bs.name 'status', count(b.StatusId) 'quantity'
FROM BillStatus bs
LEFT JOIN Bill b on b.StatusID = bs.Id
GROUP BY bs.name

但当我添加WHERE子句时,它只显示具有匹配项的状态(“Pendente”状态缺失):


如何使用
WHERE
子句显示查询中缺少的“Pendente”状态?

扩展
ON
子句:

SELECT bs.name as status, count(b.StatusId) as quantity
FROM BillStatus bs LEFT JOIN 
     Bill b 
     on b.StatusID = bs.Id AND
        MONTH(b.RefDate) = 2 AND 
        YEAR(b.RefDate) = 2019
GROUP BY bs.name;
LEFT JOIN
(正在使用筛选的表)
WHERE
子句将转到
内部JOIN

注:

  • 请勿使用单引号表示列名
  • 在SQL Server中,单引号将表示横向字符串
  • 在字符串之间的空格处使用括号
    []

    扩展
    ON
    子句:

    SELECT bs.name as status, count(b.StatusId) as quantity
    FROM BillStatus bs LEFT JOIN 
         Bill b 
         on b.StatusID = bs.Id AND
            MONTH(b.RefDate) = 2 AND 
            YEAR(b.RefDate) = 2019
    GROUP BY bs.name;
    
    LEFT JOIN
    (正在使用筛选的表)
    WHERE
    子句将转到
    内部JOIN

    注:

  • 请勿使用单引号表示列名
  • 在SQL Server中,单引号将表示横向字符串
  • 在字符串之间的空格处使用括号
    []

    将子句放入
    中,其中
    会隐式地将其转换为
    内部联接。此外,避免在
    /
    中的
    列中使用函数,因为这会影响性能。使用正确的日期逻辑:

    选择bs.[name]作为状态,
    将(b.StatusId)计数为数量
    来自dbo.billbs
    在b.StatusID=b.Id上左连接dbo.Bill b
    和b.RefDate>=“20160301”
    b.参考日期<'20160401';
    按bs[名称]分组;
    

    此外,通常最好避免别名的文字刺痛;它会使事情变得难以理解。可以使用括号(
    []
    )作为T-SQL定界标识符字符,也可以使用双引号(
    )作为ANSI字符。

    将子句放入
    WHERE
    中会隐式将其转换为
    内部联接
    。此外,尽可能避免在
    /
    WHERE
    中的
    列上使用函数(将)影响性能。使用正确的日期逻辑:

    选择bs.[name]作为状态,
    将(b.StatusId)计数为数量
    来自dbo.billbs
    在b.StatusID=b.Id上左连接dbo.Bill b
    和b.RefDate>=“20160301”
    b.参考日期<'20160401';
    按bs[名称]分组;
    

    此外,通常最好避免别名的文字戳;这会使事情变得难以理解。可以使用括号(
    []
    ),即T-SQL定界标识符字符,也可以使用双引号(
    )哪些是ANSI标准。

    理解。像符咒一样工作。非常感谢。理解。像符咒一样工作。非常感谢。理解。像符咒一样工作。非常感谢。理解。像符咒一样工作。非常感谢。