一道sql测试题目

   测试场景如下,存在一堆颜色和形状的球,需要按规则汇总。

   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,0else 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是为了分组方便。

    这个很典型的题目,其实就是一个比较数据是否一致的计数题。

posted @ 2012-09-27 16:12  天生我豺  阅读(254)  评论(0编辑  收藏  举报