>我有全名列,名字和姓氏串联起来,用"-"分隔。 我正在尝试选择不同的名字并做一个计数(*(以查看有多少汤姆、简斯、哈利等......存在。
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
,则不需要DISTINCT
。DISTINCT
只是在后台创建一个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;