使用CharIndex函数在列的子字符串上选择Distinct

时间:2018-10-18 22:20:35

标签: sql sql-server

我有fullName列,其中包括名和姓,并以'-'分隔。 我正在尝试选择不同的名字并做一个计数(*),以查看有多少汤姆,简斯,哈里等等。

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

当我执行上述操作时,我得到了正确的名字列表,但是即使我知道有多个Tom,Jane等,每个条目的名称数也得到“ 1”。

请告知。谢谢!

2 个答案:

答案 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 BYDISTINCT仅在后台创建一个GROUP BY子句。

如果您的桌子足够大,需要考虑性能,那么Gordon的CROSS APPLY会执行此操作。

由于我们是在谈论名字,所以我建议您阅读Falsehoods Programmers Believe About Names