SQL:使用count(*)返回0的计数

时间:2016-03-16 18:55:45

标签: sql winsql

我正在使用WinSQL在表上运行查询来计算文字字符串的出现次数。当我试图对一组特定的字符串进行计数时,我仍然想看看某些值是否返回0.例如:

select letter, count(*)
from table
where letter in ('A', 'B', 'C')
group by letter

让我们知道' A'发生3次,' B'发生0次,并且' C'发生5次。我希望有一个表返回原样:

letter count
A        3
B        0
C        5

但是,该表永远不会返回一个0计数的行,结果如下: 字母数 A 3 C 5

我环顾四周,看到一些文章提到了连接的使用,但是我没有运气正确地返回一个看起来像第一个例子的表。

3 个答案:

答案 0 :(得分:0)

您可以创建一个内嵌表格,其中包含您查找的所有字母,然后LEFT JOIN您的表格:

select t1.col, count(t2.letter) 
from (
   select 'A' AS col union all select 'B' union all select 'C'
) as t1
left join table as t2 on t1.col = t2.letter    
group by t1.col

答案 1 :(得分:0)

在许多平台上,您现在可以使用values语句而不是union all来创建“in-line”表 - 就像这样

select t.letter, count(mytable.letter) 
from ( values ('A'),('B'),('C') ) as t(letter)
left join mytable on t.letter = mytable.letter    
group by t.letter

答案 2 :(得分:-1)

我对WinSQL并不熟悉,但如果你在某个表格的最左边的列中没有你想要的值,那就不太好了。如果你这样做,你可以使用左连接和条件。没有它,你可以这样做:

SELECT all_letters.letter, IFNULL(letter_count.letter_count, 0)
FROM 
   (
    SELECT 'A' AS letter 
    UNION 
    SELECT 'B' AS letter 
    UNION
    SELECT 'C' AS letter
   ) all_letters 

   LEFT JOIN 

   (SELECT letter, count(*) AS letter_count 
    FROM table 
    WHERE letter IN ('A', 'B', 'C') 
    GROUP BY letter) letter_count 

   ON all_letters.letter = letter_count.letter