0

我正在使用 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

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

4

3 回答 3

0

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

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
于 2016-03-16T19:13:57.770 回答
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
于 2016-03-16T19:01:32.970 回答
-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
于 2016-03-16T19:15:34.257 回答