测试场景如下,存在一堆颜色和形状的球,需要按规则汇总。
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 #
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是为了分组方便。
这个很典型的题目,其实就是一个比较数据是否一致的计数题。