Sql 在查询的“选择”部分使用条件对结果进行计数

Sql 在查询的“选择”部分使用条件对结果进行计数,sql,sql-server,Sql,Sql Server,我需要从字母表的所有字符开始的单词数量,存在于我的数据库中 我尝试了以下查询: SELECT COUNT(id) FROM(SELECT id FROM words WHERE word LIKE 'A%') as A, COUNT(id) FROM(SELECT id FROM words WHERE word LIKE 'B%') AS B, ... COUNT(id) FROM(SELECT id FROM words WHERE word LIKE 'Z

我需要从字母表的所有字符开始的单词数量,存在于我的数据库中

我尝试了以下查询:

SELECT 
    COUNT(id) FROM(SELECT id FROM words WHERE word LIKE 'A%') as A,
    COUNT(id) FROM(SELECT id FROM words WHERE word LIKE 'B%') AS B,
    ...
    COUNT(id) FROM(SELECT id FROM words WHERE word LIKE 'Z%') AS Z
运行查询时,会出现以下错误:

Incorrect syntax near 'COUNT'.    
Incorrect syntax near the keyword 'AS'.
有趣的是,如果我只要求以“A”开头的单词,那么查询就可以正常工作

我做错了什么

编辑


只是为了给未来的读者澄清一下。我希望对字母表中的每个字母进行一次检查的原因是,根据用户的语言,字母表可能会有所不同,并且每次生成查询时都会提供该字母表,如下所示

SELECT COUNT(CASE WHEN word LIKE 'A%' THEN 1 END) AS A
      ,COUNT(CASE WHEN word LIKE 'B%' THEN 1 END) AS B
.........
      ,COUNT(CASE WHEN word LIKE 'Z%' THEN 1 END) AS Z
FROM WORDS

您不需要将
COUNT
操作与子查询分开,您可以内联执行

SELECT
    (SELECT COUNT(*) FROM words WHERE word LIKE 'A%') AS A,
    (SELECT COUNT(*) FROM words WHERE word LIKE '%B') AS B,
    (SELECT COUNT(*) FROM words WHERE word LIKE '%C') AS C

我建议将第一个角色分为两部分:

select
substring(word,1,1) as firstChar,
count(id)
from...
group by
substring(word,1,1) 

这似乎比26个单独的检查更容易。

如果您不介意将结果按行而不是按列显示,那么应该可以:

SELECT LEFT(word, 1) aChar, count(id) total
FROM words
WHERE word LIKE '[A-Z]%'
GROUP BY LEFT(word, 1)
小提琴

另外,根据你的评论:

我必须进行所有这些检查,因为字母表将根据用户的语言而有所不同


在这里使用正则表达式更有意义,因为您可以参数化正则表达式的值并添加或删除字符,而无需更改查询的代码(仅参数)。

如果需要“以开头”你不应该把
放在像'A%'
这样的地方,而不是
'%A'
谈论效率低下的问题吗?换句话说,仅仅是其中的一个。@ Apple PrimeCopfSo我对建议开放:)基于这个评论的LuPAX >我必须做所有这些检查,因为字母表将是不同的,你必须考虑一个不同的方法。这样想:如果字母表要改变,那么如果使用CASE,就必须改变SQL语句的代码。如果像我在下面的解决方案中建议的那样,使用正则表达式对它们进行分组和过滤,那么SQL语句的代码将保持不变,您只需更改参数,因为它是一个正则表达式,所以非常灵活:)请注意,这个答案不符合关于高质量答案的指导原则。添加一些解释,说明为什么这会解决OP问题,以便使其对社区有用并提高其质量。我添加了一些说明。不幸的是,我必须进行所有这些检查,因为字母表将根据用户的语言有所不同:/但它总是以第一个字母为基础吗?我只关心第一个字母,是的,出于某种原因,我认为这更有效,但那只是一种感觉。这个查询是如何工作的?@Loupax这比您在答案中指定的子查询模型更有效,因为只执行一个查询。根据你后来发表的评论,你的要求越来越清楚了。如果你能发布你期望的输入和输出,我可以给你一个很好的答案。我有一个字母序列,可以用任何语言。我想要的是,将字母序列提供给一个函数,该函数将构建一个SQL查询,该查询将返回一个结果,其中包含以每个字母开头的单词数。我真的不关心输出的格式,只要我不对每个字母运行一个查询。这允许我从正则表达式中获取任何语言的整个字母表吗?例如,我可以将俄语或希腊字母表的第一个和最后一个字母输入到这个语句中吗?如果这是可能的,我会接受这个问题,一旦我测试了它不,你不能做任何解决方案。要匹配的字符必须始终由您手动选择
A-Z
只是从
A
Z
的ASCII序列的快捷方式。如果需要添加特殊字符,则必须像下面这样单独添加它们∫√πµ]'。检查此项以查看示例。