使用 CharIndex 函数在列的子字符串上选择"非重复"



>我有全名列,名字和姓氏串联起来,用"-"分隔。 我正在尝试选择不同的名字并做一个计数(*(以查看有多少汤姆、简斯、哈利等......存在。

SELECT DISTINCT LEFT(fullName, CHARINDEX('-',fullName,0)-1) as firstName, count(*) as numOfNames
FROM tblFullNames
GROUP BY fullName

当我运行上述内容时,我得到了一个正确的名字列表,但我得到一个"1"作为每个条目的名字数量的结果,即使我知道有多个汤姆、简等......

请指教。谢谢!

只是为了让戈登的第一点明确,他说"你可以重复这个表达",他的意思是:

SELECT 
LEFT(fullName, CHARINDEX('-',fullName,0)-1) as firstName, 
count(*) as numOfNames
FROM 
tblFullNames
GROUP BY 
LEFT(fullName, CHARINDEX('-',fullName,0)-1)

如果您使用的是GROUP BY,则不需要DISTINCTDISTINCT只是在后台创建一个GROUP BY子句。

如果你的桌子足够大,可以考虑性能,那么 Gordon 的CROSS APPLY将超越这一点。

既然我们谈论的是名字,我有点需要建议你阅读程序员相信名字的谎言

您按全名分组。 您可以重复表达式 . . .或使用cross apply

SELECT v.firstName, count(*) as numOfNames
FROM tblFullNames fn CROSS APPLY
(VALUES (LEFT(fn.fullName, CHARINDEX('-', fn.fullName, 0) - 1)
)
) v(firstName)
GROUP BY v.firstName;

最新更新