SQL:返回计数为0且计数(*)的计数

SQL:返回计数为0且计数(*)的计数,sql,winsql,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

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


我环顾四周,看到一些文章提到了联接的使用,但我没有幸运地正确返回一个与第一个示例类似的表。

您可以创建一个包含所有要查找的字母的内联表,然后将您的表留给它:

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

在许多平台上,您现在可以使用values语句而不是UNIONALL来创建内嵌表-如下所示

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

我对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

@bpeikes——据我所知的SQL Server、DB2、Oracle——它是SQL标准的一部分,我之所以问这个问题,是因为我在mysql中尝试了它,但它不起作用。我并不是说它有任何问题,或者你的答案是无效的。@bpeikes-标准sql中的许多东西在mysql中都不起作用。就像10年前的标准版本中的窗口功能一样,mysql不包括它。。。你付出什么就得到什么。我们不要再吵了。PostgreSQL支持“值”和“窗口”功能,并且是免费的。至于OP,您知道WinSQL是否支持它吗?我最初对你的评论提出的问题是真诚的。几年前我曾使用SQL Server,但select的“values”函数不受支持,因此我很想知道哪些平台支持它。@bpeikes-我的回答也是真诚的。我对mysql感到失望,因为它在各个方面都不同于其他任何东西。据我所知,WinSQL只是一个客户端,所以它取决于它连接到哪个服务器。SQL Server自2008年以来一直支持值。如果你在做一个连接,你不需要“A”、“B”、“C”中的WHERE字母,这个答案和贝索斯或我的答案有什么不同?@Hogan,当我开始写这个答案时,没有其他的答案。看看回答的时间。我认为你的答案和@Bestos发布的答案都很好。我是这样写的,因为我觉得答案很清楚。若表是按字母索引的,那个么它也可能更快。并不是所有的优化器都会做正确的事情。