group by 有关问题,求秒

group by 问题,求秒。有一表如下:ID,Name1 A2 B3 A,B,C4 A,B5 C6 B想对 Name 做统计, 其中ID=3的分别要记 A

group by 问题,求秒。
有一表如下:   
ID,Name
1 A
2 B
3 A,B,C
4 A,B
5 C
6 B

想对 Name 做统计, 其中ID=3的分别要记 A,B,C 各一次,ID=4分别记A,B各一次。这样语句怎么写?
[最优解释]

引用:
结果应该是什么样子的?

猜一个

SQL code
select ID,len(Name)-len(replace(Name,',',''))+1 from tb
阿汤哥也那么晚睡
[其他解释]
学习飘过!都是强人啊! 居然都是 0:00 ++ 还在逛论坛解决问题。膜拜一下!
[其他解释]
只有4分了。
[其他解释]
结果应该是什么样子的?

猜一个

select ID,len(Name)-len(replace(Name,',',''))+1 from tb

[其他解释]
--构建测试数据
create table #TB(ID INT,NAME VARCHAR(10))
INSERT INTO #TB select '1', 'A'
      union all select '2', 'B'
      union all select '3', 'A,B,C'
      union all select '4', 'A,B'
      union all select '5', 'C'
      union all select '6', 'B'
--创建存储过程
alter proc SplitTable    
@table varchar(50),    
@Splitcolumn varchar(50),    
@flag char(1)    
as    
set nocount on    
declare @sql varchar(max)    
set @sql = '    
SELECT a.* , SUBSTRING(a.'+@Splitcolumn+', number, CHARINDEX('''+@flag+''', a.'+@Splitcolumn+' + '''+@flag+''', number) - number) AS element     
FROM '+@table+' a    
  JOIN master..spt_values   
    ON number <= LEN(a.'+@Splitcolumn+') and  type=''p''    
    AND SUBSTRING('''+@flag+''' + a.'+@Splitcolumn+', number, 1) = '''+@flag+''' and  SUBSTRING(a.'+@Splitcolumn+', number, CHARINDEX('''+@flag+''', a.'+@Splitcolumn+' + '''+@flag+''', number) - number) <>''''  
'    
exec (@sql)

--解决方案
  select top(0)*,cast(null as varchar(500)) as element into #tA from #Tb  
  insert into #ta exec splitTable '#TB','NAME',','      
  select element,count(element)as num from #ta group by element
  /*element                                                                                                                                                                                                                                                          num


-----------
A                                                                                                                                                                                                                                                                3
B                                                                                                                                                                                                                                                                4
C                                                                                                                                                                                                                                                                2



(3 行受影响)
*/


[其他解释]
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b  

SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','

DROP TABLE #
用上面的分拆列值的方法,分拆后再统计name就简单了
[其他解释]
select * from (
select ID,substring(1,1) as name
union 
select ID,substring(3,1) as name
union
select ID,substring(5,1) as name) as aa
[其他解释]
不会等高手。。。。。。。。。。。
[其他解释]
谢谢各位大的热情解答。tanleittl的过程给我启发很大,galenkeny比较简洁。实际中我比较懒,采用了galenkeny的方法。再次谢谢各位热情解答。