这样的统计如何做?

hellaslubo 2007-04-19 11:37:27
有一个贷款明细表,记录的贷款明细情况:

================================
DT |CUSTID |BALANCE
================================
01/01/07 |1001 |100.00
01/01/07 |1002 |100.00
01/02/07 |1002 |100.00
01/03/07 |1003 |100.00
01/04/07 |1003 |100.00
01/05/07 |1004 |100.00

请问一下如何统计出每天新增的客户数量,新增的贷款数量,和累计的贷款余额,就像下面这样:
===========================================
DT |NEW_CUST |NEW_BALANCE |TOTAL
===========================================
01/01/07 |2 |200.00 |200.00
01/02/07 |0 |.00 |200.00
01/03/07 |1 |100.00 |300.00
01/04/07 |0 |.00 |300.00
01/05/07 |1 |100.00 |400.00

尽量越简单越好,谢谢!

...全文
338 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
codearts 2008-07-22
  • 打赏
  • 举报
回复
晕,谁挖坟啊!
codearts 2008-07-22
  • 打赏
  • 举报
回复


select dt
,new_cust
,new_balance
,sum(new_balance) over(order by dt asc)
from
(
select distinct
dt
,(
select count(1)
from t1 x
where x.dt = t1.dt
and x.custid not in
(
select custid
from t1 y
where y.dt < t1.dt
)
) new_cust
,(
select sum(balance)
from t1 x
where x.dt = t1.dt
and x.custid not in
(
select custid
from t1 y
where y.dt < t1.dt
)
) new_balance
from t1
) ha_ha
codearts 2008-07-22
  • 打赏
  • 举报
回复


create table t1(dt date, custid varchar2(20), balance number);

begin
insert into t1 values(date '2007-01-01', '1001', 100);
insert into t1 values(date '2007-01-01', '1002', 100);
insert into t1 values(date '2007-01-02', '1002', 100);
insert into t1 values(date '2007-01-03', '1003', 100);
insert into t1 values(date '2007-01-04', '1003', 100);
insert into t1 values(date '2007-01-05', '1004', 100);
end;
HGuoliao 2008-07-16
  • 打赏
  • 举报
回复
我的思路——可以先从修改数据库表设计开始入手……

分拆为:客户表和存款明细表

客户表包括字段:
客户编号 (自动增长)
创建日期
其他信息字段

明细表就是上面的表


每天新增的客户数可从客户表查询
每天新增的的客户的存款总数可从客户表和存款明细表连接(JOIN)查询
每天累计存款数可从存款明细表计算(sum,goup by)
然后将以上信息联合(UNION)

……具体的,有时间我试试看……走了~
baojianjun 2007-04-19
  • 打赏
  • 举报
回复
每天新增这个的具体定义是什么?
是当前查询的还是隔天查询的?是时时统计的还是事后统计的?
hellaslubo 2007-04-19
  • 打赏
  • 举报
回复
晕,为了这么简单一个统计建一个数据仓库,是不是大材小用了啊?
punoja 2007-04-19
  • 打赏
  • 举报
回复
那我告诉你简单的办法吧,有百万级了
你用数据仓库吧
hellaslubo 2007-04-19
  • 打赏
  • 举报
回复
关键是数据量很大,百万级的,用游标去循环能行吗?
punoja 2007-04-19
  • 打赏
  • 举报
回复
还有变量1是要循环之前设置成0,当他循环第一次的时候变量1就变成1
以后就执行
if 变量1=1 THEN 的操作
punoja 2007-04-19
  • 打赏
  • 举报
回复
对sum那地方作个nvl(sum(),0)处理 省得报错
punoja 2007-04-19
  • 打赏
  • 举报
回复
大概思路是
从你要的那个日期开始(这个取决于你怎么定义游标)
开始把记录一条一条的插到临时表里面
每一天都统计顾客数,之后找出以前有过的数,相减得到新顾客
每一天都统计顾收入,之后找出以前有过的顾客的收入数,相减得到新收入
hellaslubo 2007-04-19
  • 打赏
  • 举报
回复
TOTAL是累计值,就是累计到当天的总和,不是新增值。

01/02/07 |0 |.00 |200.00

这一笔算错了,应该是300。

===========================================
DT |NEW_CUST |NEW_BALANCE |TOTAL
===========================================
01/01/07 |2 |200.00 |200.00
01/02/07 |0 |.00 |300.00
01/03/07 |1 |100.00 |400.00
01/04/07 |0 |.00 |500.00
01/05/07 |1 |100.00 |600.00
punoja 2007-04-19
  • 打赏
  • 举报
回复
看了一下你的钱的统计是累计的
说下大致方法吧
建一个临时表 字段DT ,NEW_CUST ,NEW_BALANCE ,TOTAL
做个日期的游标
select DT into 变量 from table
之后循环
作一个flag 比如变量1:=0;
if 变量1:=0; THEN
select COUNT(CUSTID),,sum(NEW_BALANCE) into 变量2,变量3 from table
where DT=变量;
insert into 临时表 (DT ,NEW_CUST ,NEW_BALANCE ,TOTAL)
value(变量,变量1,0.00,变量2);
变量1:=1;
if 变量1:=1; THEN
select COUNT(CUSTID),sum(NEW_BALANCE) into 变量2,变量3 from table
where DT=变量;
select COUNT(CUSTID),sum(NEW_BALANCE)into 变量4,变量5 from table
where CUSTID in (select CUSTID from table where DT<变量)
and where DT=变量;


insert into 临时表 (DT ,NEW_CUST ,NEW_BALANCE ,TOTAL)
value(变量,变量2-变量4,变量3-变量5,变量2);
结束循环
最后select * from 临时表
大体思路这样的 可能里面写错了
希望能带给你灵感

还有目前冲裤衩中 希望看到给点分
DragonBill 2007-04-19
  • 打赏
  • 举报
回复
看不懂
01/02/07 |0 |.00 |200.00
这一笔,TOTAL应该是300,为什么还是200?
hellaslubo 2007-04-19
  • 打赏
  • 举报
回复
新增的意思就是跟过去的一天相比,新增加的数量。

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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