我有fullName列,其中包括名和姓,并以'-'分隔。 我正在尝试选择不同的名字并做一个计数(*),以查看有多少汤姆,简斯,哈里等等。
SELECT DISTINCT LEFT(fullName, CHARINDEX('-',fullName,0)-1) as firstName, count(*) as numOfNames
FROM tblFullNames
GROUP BY fullName
当我执行上述操作时,我得到了正确的名字列表,但是即使我知道有多个Tom,Jane等,每个条目的名称数也得到“ 1”。
请告知。谢谢!
答案 0 :(得分:1)
您要按全名分组。您可以重复该表达式。 。 。或使用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;
答案 1 :(得分:1)
只是为了阐明戈登的第一点,他说“您可以重复表达”,他的意思是:
SELECT
LEFT(fullName, CHARINDEX('-',fullName,0)-1) as firstName,
count(*) as numOfNames
FROM
tblFullNames
GROUP BY
LEFT(fullName, CHARINDEX('-',fullName,0)-1)
如果您使用的是DISTINCT
,则不需要GROUP BY
。 DISTINCT
仅在后台创建一个GROUP BY
子句。
如果您的桌子足够大,需要考虑性能,那么Gordon的CROSS APPLY
会执行此操作。
由于我们是在谈论名字,所以我建议您阅读Falsehoods Programmers Believe About Names