十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
首先按照2列进行排序,相同的作为一组,比如:
我们提供的服务有:成都网站设计、网站制作、微信公众号开发、网站优化、网站认证、川汇ssl等。为近千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的川汇网站制作公司
按性别和所在系分组后:
以NO字段为主,进行分组。
select a.no,sum(a.金额) from table a group by a.no
同一个NO,会对应不同的姓名。
select a.no,a.姓名,sum(a.金额) from table a group by a.no,a.姓名
看不懂
目标语句:当收费醒目包含‘盐’这一项,则统计no='10' 且 姓名=‘张三’,所有收费项目对...
select a.项目,sum(a.金额) from table a where a.收费项目= '1' and a.no = '10' and a.姓名=‘张三’ group by a.项目
分组排序用group by,若需要条件则在后面加having。
多个字段的话用order by,比如:order by a,b
order by 可以让表按a排序,遇到重复的再按b再排一次序,做到把想要的字段与其他无关字段分开比较。
group by(字段) 是你分组的依据,比如按相同名字分组,或者按相同部门分组,一般 group by 是和 聚合函数配合使用,如avg(),sum()等等。
首先你的starttime是什么类型的,数字?字符?还是时间?
要出来08:00-08:30这种结果简单,只要查询的时候加一个关联就可以,
比如select starttime||'-'||endtime from table.当然试过是时间的字段类型,比如date什么的,那就转换成字符型的,反正现在看来主要是字符型。
再说分组,分组可以用case when手动分组。
按照你给的图片个人觉得可以这么分
select case when starttime=0800 and endtime=10:00 then 1
when starttime=0900 and endtime=12:00 then 2
when starttime=1330 and endtime=15:30 then 3
when starttime=1530 and endtime=17:30 then 4
end 分组, starttime||'-'||endtime from table
这个语句中的具体写法,可能会因为数据类型的原因什么的,导致语句不能直接用,需要转换一下数据类型,但是大体上的意思和写法就是这样了。
Oracle按不同时间分组统计的sql
如下表table1:
日期(exportDate)
数量(amount)
--------------
-----------
14-2月
-08
20
10-3月
-08
2
14-4月
-08
6
14-6月
-08
75
24-10月-09
23
14-11月-09
45
04-8月
-10
5
04-9月
-10
44
04-10月-10
88
注意:为了显示更直观,如下查询已皆按相应分组排序
1.按年份分组
select
to_char(exportDate,'yyyy'),sum(amount)
from
table1
group
by
to_char(exportDate,'yyyy');
年份
数量
-----------------------------
2009
68
2010
137
2008
103
2.按月份分组
select
to_char(exportDate,'yyyy-mm'),sum(amount)
from
table1
group
by
to_char(exportDate,'yyyy-mm')
order
by
to_char(exportDate,'yyyy-mm');
月份
数量
-----------------------------
2008-02
20
2008-03
2
2008-04
6
2008-06
75
2009-10
23
2009-11
45
2010-08
5
2010-09
44
2010-10
88
3.按季度分组
select
to_char(exportDate,'yyyy-Q'),sum(amount)
from
table1
group
by
to_char(exportDate,'yyyy-Q')
order
by
to_char(exportDate,'yyyy-Q');
季度
数量
------------------------------
2008-1
22
2008-2
81
2009-4
68
2010-3
49
2010-4
88
4.按周分组
select
to_char(exportDate,'yyyy-IW'),sum(amount)
from
table1
group
by
to_char(exportDate,'yyyy-IW')
order
by
to_char(exportDate,'yyyy-IW');
周
数量
------------------------------
2008-07
20
2008-11
2
2008-16
6
2008-24
75
2009-43
23
2009-46
45
2010-31
5
2010-35
44
2010-40
88
PS:Oracle按时间段分组统计
想要按时间段分组查询,首先要了解level,connect
by,oracle时间的加减.
关于level这里不多说,我只写出一个查询语句:
----level
是一个伪例
select
level
from
dual
connect
by
level
=10
---结果:
1
2
3
4
5
6
7
8
9
10
oracle时间的加减看看试一下以下sql语句就会知道:
select
sysdate
-1
from
dual
----结果减一天,也就24小时
select
sysdate-(1/2)
from
dual
-----结果减去半天,也就12小时
select
sysdate-(1/24)
from
dual
-----结果减去1
小时
select
sysdate-((1/24)/12)
from
dual
----结果减去5分钟
select
sydate-(level-1)
from
dual
connect
by
level=10
---结果是10间隔1天的时间
下面是本次例子:
select
dt,
count(satisfy_degree)
as
num
from
T_DEMO
i
,
(select
sysdate
-
(level-1)
*
2
dt
from
dual
connect
by
level
=
10)
d
where
i.satisfy_degree='satisfy_1'
and
i.insert_timedt
and
i.insert_time
d.dt-2
group
by
d.dt
例子中的sysdate
-
(level-1)
*
2得到的是一个间隔是2天的时间
group
by
d.dt
也就是两天的时间间隔分组查询
自己实现例子:
create
table
A_HY_LOCATE1
(
MOBILE_NO
VARCHAR2(32),
LOCATE_TYPE
NUMBER(4),
AREA_NO
VARCHAR2(32),
CREATED_TIME
DATE,
AREA_NAME
VARCHAR2(512),
);
select
(sysdate-13)-(level-1)/4
from
dual
connect
by
level=34
--从第一条时间记录开始(sysdate-13)为表中的最早的日期,“34”出现的分组数(一天按每六个小时分组
就应该为4)
一下是按照每6个小时分组
select
mobile_no,area_name,max(created_time
),dt,
count(*)
as
num
from
a_hy_locate1
i
,
(select
(sysdate-13)-(level-1)/4
dt
from
dual
connect
by
level
=
34)
d
where
i.locate_type
=
1
and
i.created_timedt
and
i.created_time
d.dt-1/4
group
by
mobile_no,area_name,d.dt
另外一个方法:
--按六小时分组
select
trunc(to_number(to_char(created_time,
'hh24'))
/
6),count(*)
from
t_test
where
created_time
trunc(sysdate
-
40)
group
by
trunc(to_number(to_char(created_time,
'hh24'))
/
6)
--按12小时分组
select
trunc(to_number(to_char(created_time,
'hh24'))
/
6),count(*)
from
t_test
where
created_time
trunc(sysdate
-
40)
group
by
trunc(to_number(to_char(created_time,
'hh24'))
/
6)