代码之家  ›  专栏  ›  技术社区  ›  TZ100

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

  •  0
  • TZ100  · 技术社区  · 6 年前

    我试着选择不同的名字,并做一个计数(*),看看有多少汤姆,珍妮,哈里的,等等。。。存在。

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

    当我运行上面,我得到一个正确的名字列表,但我得到一个“1”作为每个条目的名字数的结果,即使我知道有多个汤姆的,简的,等等。。。

    请告知。谢谢!

    2 回复  |  直到 6 年前
        1
  •  1
  •   Eric Brandt    6 年前

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

    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 独特的 只是创造了一个 分组依据

    如果您的桌子足够大,可以考虑性能,Gordon's CROSS APPLY 会比这更好。

    Falsehoods Programmers Believe About Names

        2
  •  1
  •   Yogesh Sharma    6 年前

    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;