【问题标题】:split comma seprate value from table in sql server从sql server中的表中拆分逗号分隔值
【发布时间】:2014-06-17 23:16:48
【问题描述】:

我有一个SQL table,其中有很多记录,我想知道其中有多少个名字,一个名字有多少时间。

表名Mst

Name

john,smith,alax,rock
smith,alax,sira
john,rock
rock,sira

我想知道那里有多少个名字和个数。

预期的输出应该是这样的

Name           Count

john           2
smith          2
alax           2
rock           3
sira           2

帮我解决它。

【问题讨论】:

  • 尝试查看这个答案 (stackoverflow.com/a/22073859/1225845) 看看我在那里提出的解决方案是否会对您有所帮助。
  • NameMst 中的每个名字都是一行吗?还是像这样串在一起?

标签: sql sql-server sql-server-2008 sql-server-2012


【解决方案1】:

您可以使用递归 CTE 和一些字符串解析来提取名称。剩下的只是聚合:

with cte as (
      select (case when names like '%,%'
                   then left(names, charindex(',', names) - 1)
                   else names
              end) as name,
             (case when names like '%,%'
                   then substring(names, charindex(',', names) + 1, len(names))
              end) as names
      from names
      union all
      select (case when names like '%,%'
                   then left(names, charindex(',', names) - 1)
                   else names
              end) as name,
             (case when names like '%,%'
                   then substring(names, charindex(',', names) + 1, len(names))
              end)
      from cte
      where names is not null
     )
select name, count(*)
from cte
group by name;

您可能已经知道,在 SQL Server 中存储逗号分隔的列表是个坏主意。您应该有一个关联/联结表,每个名称一行(以及描述它所在列表的其他列)。

【讨论】:

    【解决方案2】:
    SELECT y.Name, count(*) Count
    FROM
    (VALUES
    ('john,smith,alax,rock'),
    ('smith,alax,sira'),
    ('john,rock'),
    ('rock,sira')) x(names)
    CROSS APPLY
    (
    SELECT t.c.value('.', 'VARCHAR(2000)') Name
         FROM (
             SELECT x = CAST('<t>' + 
                   REPLACE(x.names, ',', '</t><t>') + '</t>' AS XML)
         ) a
         CROSS APPLY x.nodes('/t') t(c)
         ) y
    GROUP BY y.Name
    

    结果:

    Name   Count
    alax   2
    john   2
    rock   3
    sira   2
    smith  2
    

    【讨论】:

    • 谢谢你,它给了我完美的结果。
    【解决方案3】:
    DECLARE @table1 TABLE ( id VARCHAR(50) )
    DECLARE @table TABLE ( id1 INT,id VARCHAR(50) )
    INSERT INTO @table (id1,id) values (1, 'JOHN,rom')
    INSERT INTO @table (id1,id) values (2,'Micky,Raju')
    INSERT INTO @table (id1,id) values (2,'Micky,Raju')
    INSERT INTO @table (id1,id) values (2,'Micky,Raju')
    DECLARE @Min INT,@Max INT ,@str1 VARCHAR(100),@str2 VARCHAR(100)
    
    DECLARE @x INT = 0
    DECLARE @firstcomma INT = 0
    DECLARE @nextcomma INT = 0
    
    SELECT @x =   LEN(id) - LEN(REPLACE(id, ',', '')) + 1 from @table -- number of ids in id_list
    
    WHILE @x > 0
        BEGIN
            SELECT @nextcomma =  CASE WHEN CHARINDEX(',', id, @firstcomma + 1) = 0
                                  THEN LEN(id) + 1
                                  ELSE CHARINDEX(',', id, @firstcomma - 1)
                             END FROM @table
                             --select @nextcomma
            INSERT  INTO @table1
            SELECT  ( SUBSTRING(id, @firstcomma + 1, (@nextcomma - @firstcomma) - 1) ) FROM @table 
            SELECT @firstcomma = CHARINDEX(',', id, @firstcomma + 1)FROM @table
            SET @x = @x - 1
        END
    
    SELECT  DISTINCT id,COUNT(id)
    FROM    @table1
    GROUP BY id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2012-04-11
      • 2018-12-25
      • 2015-04-01
      相关资源
      最近更新 更多