今天做一条关于统计的SQL语句,始终不得其解,其需求如下:表A:字段A1,number类型,主键
字段A2,varchar2类型,插入的数据是从表C里取到的值,即与C1关联
字段A3,varchar2类型,插入的数据是从表B里取到的值,即与B1关联
表B:字段B1,number类型,主键
字段B2,varchar2类型,数据里只有(b1,b2,b3,b4,b5)五行
表C:字段C1,number类型,主键
字段C2,varchar2类型,数据里只有(c1,c2,c3)三行
表D(日志表):
表A插入一条数据时,此表插入一条数据;
表A修改一条数据时,此表插入一条数据
字段D1,number类型,主键
字段D2,varchar2类型,0为新增,1为修改
字段D3:date类型,插入时间
字段D4:number类型,与表A的字段A1关联
--------------------------------------
显示结果:行要显示b1,b2,b3,b4,b5所有五项,以及每一项里对应的c1,c2,c3三项。
列为D3的最近N天(可以通过查询取得时间段),暂且默认他七天吧也就是说我统计的是B2所有的五项里,每一项对应的C2的三小项每天增加修改的数量,及其之和。大致查询后的列表如下:本行显示的是列名: B2 C2 10月28日 10月29日 10月30日 10月31日 11月1日 11月2日 11月3日 合计
b1 c1 D2增加与修改的数目和 同左边 同左边 同左边 同左边 同左边 同左边 合计
b1 c2 同上边 同左边 同左边 同左边 同左边 同左边 同左边 合计
b1 c3 同上边 同左边 同左边 同左边 同左边 同左边 同左边 合计
b2 c1 同上边 同左边 同左边 同左边 同左边 同左边 同左边 合计
b2 c2 同上边 同左边 同左边 同左边 同左边 同左边 同左边 合计
b2 c3 以下省略
b3 c1
b3 c2
b3 c3
b4 c1
b4 c2
b4 c3
b5 c1
b5 c2
b5 c3
字段A2,varchar2类型,插入的数据是从表C里取到的值,即与C1关联
字段A3,varchar2类型,插入的数据是从表B里取到的值,即与B1关联
表B:字段B1,number类型,主键
字段B2,varchar2类型,数据里只有(b1,b2,b3,b4,b5)五行
表C:字段C1,number类型,主键
字段C2,varchar2类型,数据里只有(c1,c2,c3)三行
表D(日志表):
表A插入一条数据时,此表插入一条数据;
表A修改一条数据时,此表插入一条数据
字段D1,number类型,主键
字段D2,varchar2类型,0为新增,1为修改
字段D3:date类型,插入时间
字段D4:number类型,与表A的字段A1关联
--------------------------------------
显示结果:行要显示b1,b2,b3,b4,b5所有五项,以及每一项里对应的c1,c2,c3三项。
列为D3的最近N天(可以通过查询取得时间段),暂且默认他七天吧也就是说我统计的是B2所有的五项里,每一项对应的C2的三小项每天增加修改的数量,及其之和。大致查询后的列表如下:本行显示的是列名: B2 C2 10月28日 10月29日 10月30日 10月31日 11月1日 11月2日 11月3日 合计
b1 c1 D2增加与修改的数目和 同左边 同左边 同左边 同左边 同左边 同左边 合计
b1 c2 同上边 同左边 同左边 同左边 同左边 同左边 同左边 合计
b1 c3 同上边 同左边 同左边 同左边 同左边 同左边 同左边 合计
b2 c1 同上边 同左边 同左边 同左边 同左边 同左边 同左边 合计
b2 c2 同上边 同左边 同左边 同左边 同左边 同左边 同左边 合计
b2 c3 以下省略
b3 c1
b3 c2
b3 c3
b4 c1
b4 c2
b4 c3
b5 c1
b5 c2
b5 c3
c.C2,
sum(decode(d.d3), to_date('2010-10-28', 'yyyy-mm-dd'), 1, 0),
sum(decode(d.d3), to_date('2010-10-29', 'yyyy-mm-dd'), 1, 0),
sum(decode(d.d3), to_date('2010-10-30', 'yyyy-mm-dd'), 1, 0),
sum(decode(d.d3), to_date('2010-10-31', 'yyyy-mm-dd'), 1, 0),
sum(decode(d.d3), to_date('2010-10-1', 'yyyy-mm-dd'), 1, 0),
sum(decode(d.d3), to_date('2010-10-2', 'yyyy-mm-dd'), 1, 0),
sum(decode(d.d3), to_date('2010-10-3', 'yyyy-mm-dd'), 1, 0),
count(*)
from A a, C c, B b, D d
where a.A2 = c.C1
and a.A3 = b.B1
and b.B2 in ('b1', 'b2', 'b3', 'b4', 'b5')
and c.C2 in ('c1', 'c2', 'c3')
and a.A1 = d.D4
and d.D3 >= sysdate - 7
group by b.B2, c.C2
A1(number,序列ID) A2 A3 (此列为字段名)
1 11 21
2 11 22
3 13 21
4 13 23
5 14 21
6 14 21
7 14 22表B:
B1(number,序列ID) B2(varchar2) (此列为字段名)
11 b1
12 b2
13 b3
14 b4
15 b5表C:
C1(number,序列ID) C2(varchar2) (此列为字段名)
21 c1
22 c2
23 c3表D
D1 D2(varchar2,0为增加,1为修改) D3(date插入时间) D4(与A1关联) (此列为字段名)
1 0 10月28日 1
2 0 10月29日 2
3 1 10月30日 1
4 0 10月27日 3
5 0 11月2日 4
6 1 11月2日 4
7 0 11月3日 5
8 0 10月28日 6
9 0 10月28日 7
10 1 10月28日 6
统计结果:
B2 C2 10月28日 10月29日 10月30日 10月31日 11月1日 11月2日 11月3日 合计 (此列为字段名)
b1 c1 1 0 1 0 0 0 0 2(28日增加1次,30日修改1次)
b1 c2 0 1 0 0 0 0 0 1(29日增加1次)
b1 c3 0 0 0 0 0 0 0 0
b2 c1 0 0 0 0 0 0 0 0
b2 c2 0 0 0 0 0 0 0 0
b2 c3 0 0 0 0 0 0 0 0
b3 c1 0 0 0 0 0 0 0 0
b3 c2 0 0 0 0 0 0 0 0
b3 c3 0 0 0 0 0 2 0 2(2日增加1次,修改1次)
b4 c1 2 0 0 0 0 0 1 3(28日增加1次,修改1次对应A1的6,3日增加1次对应A1的5)
b4 c2 1 0 0 0 0 0 0 0(28日增加1次)
b4 c3 0 0 0 0 0 0 0 0
b5 c1 0 0 0 0 0 0 0 0
b5 c2 0 0 0 0 0 0 0 0
b5 c3 0 0 0 0 0 0 0 0 整理了一下大致如上
-- you answer!
with A as(
select 1 A1, '11' A2, '21' A3 from dual union all
select 2, '11', '22' from dual union all
select 3, '13', '21' from dual union all
select 4, '13', '23' from dual union all
select 5, '14', '21' from dual union all
select 6, '14', '21' from dual union all
select 7, '14', '22' from dual
),
B as(
select 11 B1, 'b1' B2 from dual union all
select 12, 'b2' from dual union all
select 13, 'b3' from dual union all
select 14, 'b4' from dual union all
select 15, 'b5' from dual
),
C as(
select 21 C1, 'c1' C2 from dual union all
select 22, 'c2' from dual union all
select 23, 'c3' from dual
),
D as(
select 1 D1, '0' D2, to_date('10-28','mm-dd') D3, 1 D4 from dual union all
SELECT 2, '0', to_date('10-29','mm-dd'), 2 from dual union all
select 3, '1', to_date('10-30','mm-dd'), 1 from dual union all
select 4, '0', to_date('10-27','mm-dd'), 3 from dual union all
select 5, '0', to_date('11-02','mm-dd'), 4 from dual union all
select 6, '1', to_date('11-02','mm-dd'), 4 from dual union all
select 7, '0', to_date('11-03','mm-dd'), 5 from dual union all
select 8, '0', to_date('10-28','mm-dd'), 6 from dual union all
select 9, '0', to_date('10-28','mm-dd'), 7 from dual union all
select 10,'1', to_date('10-28','mm-dd'), 6 from dual
),
bc as(select b1||'' b1,c1||'' c1,b2,c2 from b,c),
ad as(select d.*,a1,a2,a3 from a,d where d.d4=a.a1),
temp as(
select t1.b2,t1.c2,
sum(Decode(t2.d3,to_date('10-28','mm-dd'),1,0)) col1,
sum(Decode(t2.d3,to_date('10-29','mm-dd'),1,0)) col2,
sum(Decode(t2.d3,to_date('10-30','mm-dd'),1,0)) col3,
sum(Decode(t2.d3,to_date('10-31','mm-dd'),1,0)) col4,
sum(Decode(t2.d3,to_date('11-01','mm-dd'),1,0)) col5,
sum(Decode(t2.d3,to_date('11-02','mm-dd'),1,0)) col6,
sum(Decode(t2.d3,to_date('11-03','mm-dd'),1,0)) col7,
Count(*) cnt
from bc t1 , ad t2
where t1.b1=t2.a2 and t1.c1=t2.a3
group by t1.b2,t1.c2
order by t1.b2,t1.c2
)
select x.b2,x.c2,Nvl(col1,0)"10-28",Nvl(col2,0)"10-29",Nvl(col3,0)"10-30",
Nvl(col4,0)"10-31",Nvl(col5,0)"11-01",Nvl(col6,0)"11-02",Nvl(col7,0)"11-03",
Nvl(cnt,0) cnt
from bc x left join temp y
on x.b2=y.b2 and x.c2=y.c2
B2 C2 10-28 10-29 10-30 10-31 11-01 11-02 11-03 CNT
--------------------------------------------------------------
b1 c1 1 0 1 0 0 0 0 2
b1 c2 0 1 0 0 0 0 0 1
b3 c1 0 0 0 0 0 0 0 1
b3 c3 0 0 0 0 0 2 0 2
b4 c1 2 0 0 0 0 0 1 3
b4 c2 1 0 0 0 0 0 0 1
b2 c1 0 0 0 0 0 0 0 0
b3 c2 0 0 0 0 0 0 0 0
b4 c3 0 0 0 0 0 0 0 0
b2 c2 0 0 0 0 0 0 0 0
b5 c3 0 0 0 0 0 0 0 0
b1 c3 0 0 0 0 0 0 0 0
b5 c1 0 0 0 0 0 0 0 0
b5 c2 0 0 0 0 0 0 0 0
b2 c3 0 0 0 0 0 0 0 0
另外,我上面的SQL可以加个排序,order by x.b2,x.c2这样好看点,跟你结果一样!我忘了加排序。哎你这个我搞了差不多2个小时,睡觉了