求救一条关于统计的SQL语句

taishanlunjian 2010-11-04 06:23:38
今天做一条关于统计的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
...全文
135 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
taishanlunjian 2010-11-06
  • 打赏
  • 举报
回复
呵呵,谢谢 gelyon 的帮助,在你的帮忙下我已经解决了问题,再次谢谢。

结贴给分。
gelyon 2010-11-05
  • 打赏
  • 举报
回复
补充点,你B,C表中B1,C1是number型,和A表A2,A3 varchar2类型不匹配,因此我临时表bc进行了转换
另外,我上面的SQL可以加个排序,order by x.b2,x.c2这样好看点,跟你结果一样!我忘了加排序。

哎。。。你这个我搞了差不多2个小时,睡觉了。。。
gelyon 2010-11-05
  • 打赏
  • 举报
回复

-- 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
gelyon 2010-11-05
  • 打赏
  • 举报
回复
昨晚辛苦自己了,此贴收藏!
taishanlunjian 2010-11-04
  • 打赏
  • 举报
回复
表A:
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

整理了一下大致如上
taishanlunjian 2010-11-04
  • 打赏
  • 举报
回复
谢谢楼上,我现在整理一下数据,列出来能清晰点
YY_MM_DD 2010-11-04
  • 打赏
  • 举报
回复


select b.B2,
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
碧水幽幽泉 2010-11-04
  • 打赏
  • 举报
回复
看了有点头晕。
LZ不如给点数据,以及列出想要的结果吧!

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧