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各一次。这样语句怎么写?
[最优解释]
[其他解释]
学习飘过!都是强人啊! 居然都是 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用上面的分拆列值的方法,分拆后再统计name就简单了
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 #
[其他解释]
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的方法。再次谢谢各位热情解答。
