
select sum(人数) as 人数,
convret(varchar(10),日期,112) as 日期
from 报名表
group by convret(varchar(10),日期,112)
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
isatisfy_degree='satisfy_1'
and
iinsert_time<dt
and
iinsert_time>
ddt-2
group
by
ddt
例子中的sysdate
-
(level-1)
2得到的是一个间隔是2天的时间
group
by
ddt
也就是两天的时间间隔分组查询
自己实现例子:
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
ilocate_type
=
1
and
icreated_time<dt
and
icreated_time>
ddt-1/4
group
by
mobile_no,area_name,ddt
另外一个方法:
--按六小时分组
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)
思路:先建一个中间表 sys_date(s_date var(8))
接着,把每天数据插入。
最后进行关联查询。
查询实例:
SELECT nvl(CONVERT(VARCHAR(20), TIME, 112),0), COUNT(IP)
FROM WEB_USER join sys_date on CONVERT(VARCHAR(20), TIME, 112)=sys_dates_date
where sys_dates_date >='20100101'
and sys_dates_date <='20100131'
GROUP BY CONVERT(VARCHAR(20), TIME, 112)
ORDER BY CONVERT(VARCHAR(20), TIME, 112)
楼上的只统计了一个月的吧
WITH t AS(SELECT ROWNUM
FROM DUAL
CONNECT BY ROWNUM <= 12)
SELECT TO_CHAR (LAST_DAY (TO_DATE ( TO_CHAR (SYSDATE, 'YYYY')
|| LPAD (TO_CHAR (ROWNUM), 2, 0),
'YYYYMM'
)
),
'YYYY-MM'
)
|| '月',
TO_CHAR (LAST_DAY (TO_DATE ( TO_CHAR (SYSDATE, 'YYYY')
|| LPAD (TO_CHAR (ROWNUM), 2, 0),
'YYYYMM'
)
),
'DD'
)
|| '天'
FROM t
直接全选复制粘贴运行
数量就是在Bar Code列?
如A列为“序列号”,随后为B、C列,
按小时统计数量: 以统计9时为例,=SUMPRODUCT((HOUR($C:$C)=9)($B:$B))
按分钟统计数量:以统计13分为例,=SUMPRODUCT((MINUTE($C:$C)=13)($B:$B))
按天统计数量:以20日为例,=SUMPRODUCT((DAY($C:$C)=20)($B:$B))
如果在D1中输入要统计的日期和时间,如2012-10-20 9:12:59,则上面的公式分别改为:
=SUMPRODUCT((HOUR($C:$C)=HOUR(D1))($B:$B))
=SUMPRODUCT((MINUTE($C:$C)=MINUTE(D1)($B:$B))
=SUMPRODUCT((DAY($C:$C)=DAY(D1))($B:$B))
sqlserver写法
其他数据库的话,语法得改,字段类型不一致的话也得改
创建表
create table test(姓名 varchar(10),
时间 varchar(10))
insert into test values ('张三','2014-1-2')
insert into test values ('张三','2014-1-6')
insert into test values ('李四','2014-1-2')
执行
select s1from
(select t2姓名,t1rq
from
(select convert(varchar(10),rq,120) rq
from
(select cast('2014-1-2' as datetime)+number rq from masterspt_values where type='p') t
where trq between '2014-1-2' and '2014-1-6') t1,
(select distinct 姓名 from test) t2) s1
where not exists (select 1 from test s2 where s1姓名=s2姓名 and s1rq=convert(varchar(10),cast(s2时间 as datetime),120))
结果
----------------------补充---------------
你下次能不能直接追问,这样补充都看不到的,幸亏我又看了一眼
select s1from
(select t2姓名,t1rq
from
(select convert(varchar(10),rq,120) rq
from
(select cast('2014-1-2' as datetime)+number rq from masterspt_values where type='p') t
where trq between '2014-1-2' and '2014-1-6') t1,
(select 姓名 from 人员表) t2) s1
where not exists (select 1 from test s2 where s1姓名=s2姓名 and s1rq=convert(varchar(10),cast(s2时间 as datetime),120))
order by s1姓名,s1rq
我新建了一个人员表,里边就一列,叫“姓名”
没有必要这么做,既然你知道如何进行查询,那么可以有两个方案来实现每天的查询:
在查询语句中嵌入当前日期作为查询条件,由此进行和数据表中的Y字段比较,进行筛选,就可以得出当前日期的记录数;此方法在查询语句中实现,比较死,只能得出语句中设定日期的记录数。
灵活一点的办法是需通过查询画面来实现,在画面中增加一个日期的输入框或者嵌入日历,有此选择需要查询的日期,然后再将这个日期嵌入前面所提的查询语句,如此就可以实现任意日期的查询,得到任意查询日期的记录。
以上就是关于sql语句 按天统计人数全部的内容,包括:sql语句 按天统计人数、Oracle数据库按时间进行分组统计数据的方法、sql按日期统计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)