group by 分组有关问题,望大神讨论!
group by 分组问题,望大神讨论!!
一般分组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)
这个组该怎样分啊
------解决方案--------------------
一般分组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)
这个组该怎样分啊
------解决方案--------------------
- SQL code
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]
------解决方案--------------------
//前面回复错了,这个为准
- SQL code
--建表 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 行受影响)
------解决方案--------------------
- SQL code
--显示 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
------解决方案--------------------
因为你用的是oracle,这里是SQL SERVER版,我们的是T-SQL!
oracle里用 instr 函数代替charindex