按列名对计数数据进行分组

时间:2013-10-28 13:58:46

标签: sql database sql-server-2008

我有以下表格:

  1. QuranMaster
  2. enter image description here

    2.QuranPrayed

    enter image description here

    我只是希望拥有所有的siparas,并计算结果。

    表示预期结果如下:

    Sipara1      3
    Sipara2      2
    ..
    ..
    ..
    

    Sipara1是3,因为它在QuranPrayed中已经到过3次。

    我做了以下查询:

    select qm.sipara,COUNT(qp.Sipara) from QuranMaster qm,QuranPrayed qp 
    where qp.sipara=qm.sipara
    group by qm.sipara 
    

    当QuranPrayed有值时,此查询可以正常工作。

    但是当QuaranPrayed没有值时,它并没有显示我的结果。

    我的期望是:

    Sipara1      0
    Sipara2      0
    ..
    ..
    ..
    

    请帮帮我。

2 个答案:

答案 0 :(得分:4)

您需要使用LEFT JOIN:

SELECT  qm.sipara, Prayed = COUNT(qp.Sipara) 
FROM    QuranMaster qm
        LEFT JOIN QuranPrayed qp 
            ON qp.sipara=qm.sipara
GROUP BY qm.sipara;

值得注意的是,您使用的隐式连接语法已超过20年,并在ANSI 92中使用显式连接替换。 This article Aaron Bertrand提出了一些非常有效的理由来切换到更新的语法。对你来说最重要的可能就是使用LEFT JOIN。以前在SQL-Server中你的查询应该是:

select qm.sipara,COUNT(qp.Sipara) 
from QuranMaster qm,QuranPrayed qp 
where qp.sipara=*qm.sipara
group by qm.sipara 

然而,这已被弃用,您可能会收到以下错误:

  

查询使用非ANSI外连接运算符(“* =”或“= *”)。要在不进行修改的情况下运行此查询,请使用ALTER DATABASE的SET COMPATIBILITY_LEVEL选项将当前数据库的兼容级别设置为80。强烈建议使用ANSI外连接运算符(LEFT OUTER JOIN,RIGHT OUTER JOIN)重写查询。在SQL Server的未来版本中,即使在向后兼容模式下也不支持非ANSI连接运算符。

答案 1 :(得分:1)

select qm.sipara, COUNT(qp.Sipara) ReadSparas 
from QuranMaster qm LEFT JOIN QuranPrayed qp 
ON qp.sipara=qm.sipara
group by qm.sipara