如何进行数据库分组统计

如何进行数据库分组统计,第1张

s.Open "select 材料入库.材料编号,sum(材料入库.数量) as 材料入库, sum(材料出库.数量) as 材料使用,sum(材料入库.数量 - 材料出库.数量) as 材料剩余 from 材料入库,材料出库 group by 材料入库.材料编号", conn, adOpenDynamic, adLockOptimistic

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_time<dt

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_time<dt

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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6740424.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存