有一表如下:
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各一次。这样语句怎么写?
------最佳解决方案--------------------
阿汤哥也那么晚睡
------其他解决方案--------------------
学习飘过!都是强人啊! 居然都是 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