一般分组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)这个组该怎样分啊
现在有一个需求就是细化对列名锁对应的值进行分组,比如需要将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)这个组该怎样分啊
这样就用order by 吧!order by (case when 条件1 then 0
when 条件2 then 1
when.... then 2
....else N end)
一样,把这个字段设置下!
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
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
--建表
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 行受影响)
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 行受影响)
else when [v]>=20 and [v]<30 then 2 end
end
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
1.case charindex('苏E',CarID)----这个我知道,返回的是‘苏E’在carid中的位置。 但这一句就有点看不懂了 case charindex(CarID,'苏EM,苏EN,苏EX') 这个是怎么判断到底是'非苏EM苏EN苏EX'还是 '苏EM苏EN苏EX'的呢?2.这是sql语句不管在什么数据库下都可以得到相同的实验结果吧,我用的是oracle?
哦,我理解了,但是我的carid不是那么简单的就是‘苏E’是一个完整的车牌号 比如”苏EM7868“ 所以charindex是有点问题的,有没有其他的函数处理的?比如只截取我车牌号的前3个字符???然后就可以用charindex了
--里面这一小段
case charindex(CarID,'苏EM,苏EN,苏EX')
--改成
case charindex(left(CarID,3),'苏EM,苏EN,苏EX') --这样就可以了
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
我的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
急需解决????
oracle里用 instr 函数代替charindex
哦,是这样啊 我好菜谢谢你
那oracle里面用什么代替left函数的啊?只要将charindex替换成instr就行吗?其他语法都一样吧?