一般分组group by 后面只能跟字段列名,比如group by age——按年龄分组,比如有n个不同年龄就会分n组。
现在有一个需求就是细化对列名锁对应的值进行分组,比如需要将10—20岁分为一组,20—30分为一组。这时候 group by后面应该怎样写呢???望大神们写出下列实例的sql语句:例子:
表1:
     摄像头id   车牌号
        1         苏EM
        2         苏EN
        3         苏EX
        4         苏EG
        5         京A
        6         渝G
        7         苏A需求如下:苏EM,苏EN ,苏EX为一组,
          不包括这三类——苏EM,苏EN ,苏EX,且以苏E开头的为一组(如苏EG)
          不以苏E开头的为一组。如(苏A,京A,渝G)这个组该怎样分啊
          

解决方案 »

  1.   


    这样就用order by 吧!order by (case when  条件1 then 0
                   when  条件2 then 1
                   when....    then 2
                    ....else N end)
      

  2.   

    可是我想统计这三组的数量必须用group by啊
      

  3.   


    一样,把这个字段设置下!
    select *,(case when  条件1 then 0
                   when  条件2 then 1
                   when....    then 2
                    ....else N end)flag
    from tb然后分组求和
    select id,sum(num)num
    from (上边的查询)u
    group by flag
      

  4.   


    select '类别(含EM,EN,EX)' '类别1', sum(case when(charindex('EM',tag)>0 or charindex('EN',tag)>0 or charindex('EX',tag)>0)
    then id else 0 end) '总数'
    ,'类别(除类别1外,以E开头)' '类别2', sum(case when(charindex('EM',tag)<=0 and charindex('EN',tag)<=0 and charindex('EX',tag)<=0 
    and charindex('E',tag)=2)
    then id else 0 end) '总数'
    ,'类别(其它)' '类别3', sum(case when(charindex('E',tag)<=0) then id else 0 end) '总数'
    from [tb] ----------------------------
    类别1           总数      类别2                   总数       类别3         总数
    -----------------------------------------------------------------------------
    类别(含EM,EN,EX) 6 类别(除类别1外,以E开头) 4 类别(其它) 18
      

  5.   


    --建表
    create table #CarMonitor(ID int, CarID varchar(20))
    --数据
    insert into #CarMonitor
    select 1,'苏EM' union all
    select 2,'苏EM' union all
    select 3,'苏EX' union all
    select 4,'苏EG' union all
    select 5,'京A' union all
    select 6,'渝G' union all
    select 7,'苏A' 
    --分组统计
    select case charindex('苏E',CarID) when 0 then '非苏E' else '苏E' end as CarGroup, count(0) as [count] from #CarMonitor
    group by case charindex('苏E',CarID) when 0 then '非苏E' else '苏E' end
    --结果CarGroup count
    -------- -----------
    非苏E      3
    苏E       4(2 行受影响)
      

  6.   

    //前面回复错了,这个为准--建表
    create table #CarMonitor(ID int, CarID varchar(20))
    --数据
    insert into #CarMonitor
    select 1,'苏EM' union all
    select 2,'苏EM' union all
    select 3,'苏EX' union all
    select 4,'苏EG' union all
    select 5,'京A' union all
    select 6,'渝G' union all
    select 7,'苏A' 
    --分组统计
    select case charindex('苏E',CarID) when 0 then '其他' 
       else case charindex(CarID,'苏EM,苏EN,苏EX') when 0 then '非苏EM苏EN苏EX' else '苏EM苏EN苏EX' end
          end as CarGroup, count(0) as [count] from #CarMonitor
    group by case charindex('苏E',CarID) when 0 then '其他' 
       else case charindex(CarID,'苏EM,苏EN,苏EX') when 0 then '非苏EM苏EN苏EX' else '苏EM苏EN苏EX' end
          end 
    --结果CarGroup       count
    -------------- -----------
    非苏EM苏EN苏EX     1
    其他             3
    苏EM苏EN苏EX      3(3 行受影响)
      

  7.   

    group by age,case when [v]>=10 and [v]<20 then 1 
    else when [v]>=20 and [v]<30 then 2 end
    end
      

  8.   


    with cte as
    (
    select age,case when [v]>=10 and [v]<20 then 1 else 
    case when [v]>=20 and [v]<30 then 2 end 
    end as g
    from #t
    )
    select age,g from cte group by age,g
      

  9.   

    您好,非常感谢您这么认真的对待我的问题,还特地建表实验,你的回答对我很有帮助,只是您回答的几个地方我还没有看懂,望指教:
    1.case charindex('苏E',CarID)----这个我知道,返回的是‘苏E’在carid中的位置。 但这一句就有点看不懂了 case charindex(CarID,'苏EM,苏EN,苏EX') 这个是怎么判断到底是'非苏EM苏EN苏EX'还是 '苏EM苏EN苏EX'的呢?2.这是sql语句不管在什么数据库下都可以得到相同的实验结果吧,我用的是oracle?
      

  10.   


    哦,我理解了,但是我的carid不是那么简单的就是‘苏E’是一个完整的车牌号 比如”苏EM7868“ 所以charindex是有点问题的,有没有其他的函数处理的?比如只截取我车牌号的前3个字符???然后就可以用charindex了
      

  11.   


      --里面这一小段
      case charindex(CarID,'苏EM,苏EN,苏EX')
      --改成
      case charindex(left(CarID,3),'苏EM,苏EN,苏EX')  --这样就可以了
      

  12.   

    --显示
    SELECT * FROM table_name
    ORDER BY
    CASE 
    WHEN CHARINDEX(LEFT(车牌号, 3), N'苏EM,苏EN,苏EX') > 0 THEN 1  --苏EM,苏EN,苏EX为一组
    WHEN LEFT(车牌号, 2) = N'苏E' THEN 2 --不包括以上三类且以苏E开头的为一组
    ELSE 3 --其它3
    END
    --统计
    SELECT
    车牌号类型 = 
    CASE 
    WHEN CHARINDEX(LEFT(车牌号, 3), N'苏EM,苏EN,苏EX') > 0 THEN N'苏EM|苏EN|苏EX'
    WHEN LEFT(车牌号, 2) = N'苏E' THEN N'苏E'
    ELSE N'其它'
    END,
    摄像头数量 = COUNT(1)
    FROM table_name
      

  13.   

    您好,为什么我的sql语句会报 charindex :标识符无效 这样的错误呢???oracle不能用?
    我的sql语句如下:select case charindex('苏E',LICENCE_PLATE) when 0 then '其他' else case charindex(left(LICENCE_PLATE,3),'苏EM,苏EN,苏EP,苏EX') when 0 then '非苏EM,苏EN,苏EP,苏EX' else '苏EM,苏EN,苏EP,苏EX' end end as Cargroup, count(0) as Count from Dim_Licence_plate where CALENDAR_KEY >= 20110227 and CALENDAR_KEY <= 20110227 and CAMERAID in ( select CAMERAID from Dim_HD_camera where SEGMENTID in ( select SEGMENTID from Dim_segment ) ) group by case charindex('苏E',LICENCE_PLATE) when 0 then '其他' else case charindex(left(LICENCE_PLATE,3),'苏EM,苏EN,苏EP,苏EX') when 0 then '非苏EM,苏EN,苏EP,苏EX' else '苏EM,苏EN,苏EP,苏EX' end end
    急需解决????
      

  14.   

    你的答案也可以,但是为什么sql会报 CHARINDEX:无效标识符  这样的错误了????真急死人乐
      

  15.   

    因为你用的是oracle,这里是SQL SERVER版,我们的是T-SQL!
    oracle里用 instr 函数代替charindex
      

  16.   


    哦,是这样啊 我好菜谢谢你
    那oracle里面用什么代替left函数的啊?只要将charindex替换成instr就行吗?其他语法都一样吧?