遇到group by统计问题

w11x22b33 2009-07-16 11:38:09
加精
简化表数据为:
日期 科目 借 贷 余额 row_id( 主键)
2009-6-1 100201 1 2 3 1
2009-6-1 100201 2 3 4 2
2009-6-1 100202 3 4 5 3
2009-6-1 100202 8 8 9 4
2009-6-1 100203 4 4 6 5
2009-6-2 100201 1 2 3 6
2009-6-2 100201 2 3 12 7
2009-6-2 100202 3 4 1 8
2009-6-3 100203 5 2 8 9
2009-6-4 100201  1 3 4 10
...................................................................(数据多条)
说明:科目分1级如(1002)和2级,2级科目为100201,100202,100203
希望查询:用户页面输入一级科目如:1002统计出其下2级科目每日合计
格式如下:日期 借 贷 余额


2009-6-1查询结果:
日期 借 贷 余额
2009-6-1 1+2+3+8+4 2+3+4+8+4 比较100201取最大row_id对应余额是4 ,比较100202取最大row_id对应余额是9 ,比较100203取最大row_id对应余额是6 余额为:4+9+6 不是3+4+5+9+6


2009-6-2 1+2+3 2+3+4 比较100201取最大row_id对应余额是4 ,比较100201取最大row_id对应余额是12 ,比较100203取最大row_id对应余额是1,前期同2级100203科目最大row_id对应余额6 余额为:12+1+6 不是12+1

2009-6-3 5 2 前期同2级100201科目最大row_id对应余额12,前期同2级100202科目最大row_id对应余额1 余额为:12+1+8 不是8也不是12+1+6
.....................................................................................

规则:用户在前台输入一级科目如1002和不定范围的时间段如2009-5-22到2009-6-4,请给出每日统计,案例和格式如上
1级下2级科目数目不定,但是前4位编码一定是1级科目编码如:1002,2级科目之间编码唯一,查询可用like '1002%'
2借,贷统计
余额统计:是统计group by查询开始日期到每天的时间段,而不是每天 如:2009-6-3余额为:12+1+8 不是8也不是12+1+6
   如果这段时间没有科目100204发生业务,暂且不管.


个人遇到困难,请高手最好能给出SQL,关键是余额合计,谢先.




...全文
947 78 打赏 收藏 转发到动态 举报
写回复
用AI写文章
78 条回复
切换为时间正序
请发表友善的回复…
发表回复
freesialll 2012-08-18
  • 打赏
  • 举报
回复
竟然发现我登陆了
wanbolantian 2010-07-19
  • 打赏
  • 举报
回复
看不明白想实现啥效果。
duanxugang 2010-02-11
  • 打赏
  • 举报
回复
看起来有点乱,,,,,
w11x22b33 2009-08-17
  • 打赏
  • 举报
回复
已经结帖给分了,谢谢各位留言,也可以看下100分的分配
w11x22b33 2009-08-05
  • 打赏
  • 举报
回复
新建一表W_TEST_day
循环每天每个科目插入初始数据,
再统计每天发生借,贷,并更新到W_TEST_day 每日sum(借) sum(贷)
根据统计每天发生借,贷,如是2009-6-3,侧取<2009-6-3所有日发生借,贷合计,+ 2009-6-3发生借,贷
算出 2009-6-3 日余额。

zhenghanqiu 2009-07-27
  • 打赏
  • 举报
回复
xuejiecn 2009-07-24
  • 打赏
  • 举报
回复
还没完啊,>?
liuqiaojun1988 2009-07-23
  • 打赏
  • 举报
回复
看不懂
amyzhangqian 2009-07-23
  • 打赏
  • 举报
回复
我怎么没次看这些头就大了 郁闷
xuejiecn 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 w11x22b33 的回复:]
说明:科目分1级如(1002)和2级,2级科目为100201,100202,100203,100204,...
希望查询:页面输入一级科目如:1002和时间段2009-6-1~2009-6-3 统计出其下2级科目时间段每日合计
如2009-6-1~2009-6-3查询结果:
日期                              余额
2009-6-1                余额为:4+9+6  不是3+4+5+9+6
2009-6-2                余额为:12+1+6  不是12+1
2009-6-3                余额为:12+1+8  不是8也不是12+1+6
余额统计:
时间段内,当日如有同2级科目多条侧取最大row_id对应余额,不同2级科目再sum
时间段内,当日如没有此2级科目但时间段内前某些天发生了数据,侧取最大row_id对应余额,2级科目再sum
时间段内,没有科目100204发生业务,暂且不管.

[/Quote]

见41楼,看过没?
长风dad 2009-07-23
  • 打赏
  • 举报
回复
看看,还正在学习中!!
SlaughtChen 2009-07-23
  • 打赏
  • 举报
回复
关注
冰岛男孩 2009-07-23
  • 打赏
  • 举报
回复
mark
ycscsjj 2009-07-23
  • 打赏
  • 举报
回复
yan jiu xia
yuanhaobin 2009-07-23
  • 打赏
  • 举报
回复
嗯 支持了 呵呵
w11x22b33 2009-07-23
  • 打赏
  • 举报
回复
---时间段是页面传送过来的,如:'2009-6-1'~'2009-6-3'

SELECT A.row_id,A.time_value,A.AMOUNT,a.DOC_NO FROM W_TEST A WHERE A.ROW_ID IN (
SELECT MAX(ROW_ID) ROW_ID FROM W_TEST
WHERE time_value>='2009-6-1' AND time_value<='2009-6-3'
GROUP BY time_value,DOC_NO
) --取出时间段内每日存在的2级帐号数据统计,但是缺少数据!


SELECT DOC_NO,MAX(time_value) last_time_value FROM W_TEST WHERE time_value>='2009-6-1' AND time_value<='2009-6-3'
AND DOC_NO IN (
SELECT DISTINCT DOC_NO FROM W_TEST where SUBSTR(doc_no,1,4)='1002'
AND time_value>='2009-6-1' AND time_value<='2009-6-3'
) GROUP BY DOC_NO --取出时间段内2级帐号出现最大时间



---黔驴技穷,期待高手..
w11x22b33 2009-07-23
  • 打赏
  • 举报
回复
---to 64楼 SQL不对


----DB2 环境
--DROP TABLE W_TEST
CREATE TABLE W_TEST
(
ROW_ID DECIMAL(18,0) DEFAULT -1 NOT NULL,
time_value VARCHAR(100),
amount DECIMAL(18,0),
doc_no VARCHAR(100),
PRIMARY KEY (row_id)
) ;
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(1,'2009-6-1',3,'100201');
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(2,'2009-6-1',4,'100201');
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(3,'2009-6-1',5,'100202');
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(4,'2009-6-1',9,'100202');
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(5,'2009-6-1',6,'100203');
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(6,'2009-6-2',3,'100201');
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(7,'2009-6-2',12,'100201');
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(8,'2009-6-2',1,'100202');
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(9,'2009-6-3',8,'100203');
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(10,'2009-6-4',4,'100201');



select t1.time_value,t1.doc_no,sum(case when t1.row_id in
(select max(row_id) from W_TEST where time_value=t1.time_value and doc_no=t1.doc_no
group by doc_no) then t1.amount else 0 end) as amount
from W_TEST t1
where SUBSTR(doc_no,1,4)='1002'
INSERT INTO W_TEST(ROW_ID,time_value,amount,doc_no) VALUES(11,'2009-6-4',55,'100204');
----------------------------报错---

建安 2009-07-22
  • 打赏
  • 举报
回复
真的要顶一下
zhangwonderful 2009-07-22
  • 打赏
  • 举报
回复
select 日期,科目,sum(借),sum(贷),max(余额)
from 科目数据表
where 科目 like 一级科目变量值 || '%'
group by 日期,科目
chenjianyong94 2009-07-22
  • 打赏
  • 举报
回复
回帖是一种美德!每天回帖即可获得 10 分可用分
加载更多回复(54)

5,889

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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