测试场景如下,存在一堆颜色和形状的球,需要按规则汇总。
001 红色 圆形
005 红色 圆形
006 红色 圆形
008 红色 圆形
010 黑色 球形
011 黄色 方形
012 红色 圆形
需要得出的结果是:4红色圆形 1黑色球形 1 黄色方形 1红色球形
看到题目,我们分析一下,这是一个汇总题目,首先需要把颜色+形状汇总为不重复的值,然后找出count值,需要注意的是红色圆形一共有5个,但是结果分别是4个和1个,这里就需要仔细看一下。经过分析,这其实是一个比较题,我们把颜色形状看成一个值,比较第二行值和第一行值是否相等,如果相等,就需要计数上+1,这是一个很典型的题目,找到了这里,思路也就有了。
1 create table #tb(编号 varchar( 10),颜色 varchar( 10),形状 varchar( 10)) 2 insert into #tb values( ' 001 ' , ' 红色 ' , ' 圆形 ') 3 insert into #tb values( ' 005 ' , ' 红色 ' , ' 圆形 ') 4 insert into #tb values( ' 006 ' , ' 红色 ' , ' 圆形 ') 5 insert into #tb values( ' 008 ' , ' 红色 ' , ' 圆形 ') 6 insert into #tb values( ' 011 ' , ' 黑色 ' , ' 球形 ') 7 insert into #tb values( ' 015 ' , ' 黄色 ' , ' 方形 ') 8 insert into #tb values( ' 026 ' , ' 红色 ' , ' 圆形 ') 9 insert into #tb values( ' 031 ' , ' 红色 ' , ' 圆形 ') 10 insert into #tb values( ' 035 ' , ' 黄色 ' , ' 球形 ') 11 insert into #tb values( ' 036 ' , ' 黑色 ' , ' 球形 ') 12 insert into #tb values( ' 039 ' , ' 黑色 ' , ' 球形 ') 13 insert into #tb values( ' 055 ' , ' 黑色 ' , ' 球形 ') 14 go 15 16 select fid = 0,id = 0,颜色 +形状 as 颜色形状 into # from #tb order by 编号 17 18 select * from # 19 20 declare @颜色形状 varchar( 20), @i int, @j int 21 update # set id = @i,fid = @j, 22 @i = case when @颜色形状 =颜色形状 then isnull( @i, 0) + 1 else 1 end, 23 @j = case when @颜色形状 =颜色形状 then isnull( @j, 0) else isnull( @j, 0) + 1 end, 24 @颜色形状 =颜色形状 25 select ltrim( max(id)) +颜色形状 as 结果 from # group by fid,颜色形状 order by fid 26 drop table #
这里的处理过程是创建变量@颜色形状,来保存前一行值,用来和当前值进行比较,如果相等 @j+1,最后存在@i是为了分组方便。
这个很典型的题目,其实就是一个比较数据是否一致的计数题。