Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从sql server中的表中拆分逗号seprate值_Sql_Sql Server_Sql Server 2008_Sql Server 2012 - Fatal编程技术网

从sql server中的表中拆分逗号seprate值

从sql server中的表中拆分逗号seprate值,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我有一个SQL表,其中有许多记录,我想知道其中有多少个名称,一个名称在其中有多少时间 表名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 请帮

我有一个
SQL表
,其中有许多记录,我想知道其中有多少个名称,一个名称在其中有多少时间

表名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

请帮助我解决此问题。

您可以使用递归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中存储逗号分隔的列表是一个坏主意。您应该有一个每个名称一行的关联/连接表(以及描述其所在列表的其他列)。

尝试查看此答案(),看看我在那里提出的解决方案是否对您有帮助。名称中的每个名称都是一行吗?还是像那样串在一起?谢谢,这给了我完美的结果。
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
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