2014-05-01 67 views
1

我有一個SQL table其中有很多記錄,我想知道它裏面有多少個名字以及它裏面有多少個名字。從sql server中的表中分割逗號seprate值

表NameMst

Name 

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

我想找到多少名在那裏,它的數量。

預期的輸出應該是這樣的

Name   Count 

john   2 
smith   2 
alax   2 
rock   3 
sira   2 

幫我解決它。

+0

嘗試尋找這個答案(http://stackoverflow.com/a/22073859/1225845),看看我提出的解決方案也將幫助你。 – AHiggins

+0

是NameMst中的每一個名字?或者他們像這樣串在一起? – DaImTo

回答

1
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 
+0

謝謝,它給了我完美的結果。 –

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中存儲逗號分隔列表是一個壞主意。您應該有一個關聯/聯結表,每個名稱有一行(以及描述它所在列表的其他列)。

0
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