查看: 349|回复: 8

[SQL] 求助:本月之前的发生合计作为本月期初

[复制链接]
论坛徽章:
0
发表于 2019-5-14 12:14 | 显示全部楼层 |阅读模式
原始表T1数据已汇总
T1
useyearusemonthlogicmmcustomidsaleridaddmoneylosemoney
2019
1
24229
21
66
100
-45
2019
2
24230
21
66
200
-88
2019
3
24231
21
66
300
-146
2019
4
24232
21
66
400
-262
2019
5
24233
21
66
500
-377
2019
1
24229
33
45
100
-45
2019
2
24230
33
45
200
-88
2019
3
24231
33
45
300
-146
2019
4
24232
33
45
400
-262
2019
5
24233
33
45
500
-377


期望结果
useyearusemonthlogicmmcustomidsaleridlastmoneyaddmoneylosemoneyremmoney
2019
5
24233
21
66
582
500
-377
705
2019
5
24233
33
45
582
500
-377
705


结果按每月查询,lastmoney = 本月之前的所有月份的addmoney+losemoney;
remmoney = lastmoney + addmoney + losemoney;

目前是在主查询里面嵌套子查询来进行,效率太低,请大神帮帮忙看看能否其他方式可以实现
select a.useryear,
         a.usemonth,
         a.logicmm,
         a.customid,
         a.salerid,
         (select sum(b.addmoney) + sum(b.losemoney)
          from   T1 b
          where  a.customid = b.customid
          and    a.salerid = b.salerid
          and    a.logicmm > b.logicmm
          group  by b.customid, b.salerid) lastmoney,
         a.addmoney,
         a.losemoney
         (select sum(b.addmoney) + sum(b.losemoney)
          from   T1 b
          where  a.customid = b.customid
          and    a.salerid = b.salerid
          and    a.logicmm > b.logicmm
          group  by b.customid, b.salerid) + a.addmoney + a.losemoney  remmoney

from   T1 a

论坛徽章:
540
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2019-5-14 14:12 | 显示全部楼层
第一个用:
sum(addmoney + losemoney) over(partition by customid,salerid order by logicmm) - addmoney - losemoney

你没有按照置顶帖的要求给出CREATE TABLE和INSERT脚本,就只能帮到这。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2019-5-14 14:50 | 显示全部楼层
newkid 发表于 2019-5-14 14:12
第一个用:sum(addmoney + losemoney) over(partition by customid,salerid order by logicmm) - addmoney  ...

--建表脚本如下:
-- Create table
create table T1
(
  useyear   NUMBER(4),
  usemonth  NUMBER(2),
  logicmm   NUMBER(10),
  customid  NUMBER(10),
  salerid   NUMBER(10),
  addmoney  NUMBER,
  losemoney NUMBER
);

-----模拟数据如下:
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 5, 24233, 21, 126, 6174.64, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 3, 24231, 21, 126, 0, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 4, 24232, 21, 126, 598.8, 598.8);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 5, 24233, 22, 126, 124028.85, 33861);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 3, 24231, 22, 126, 0, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 4, 24232, 22, 126, 134390, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 5, 24233, 23, 83, 70678.3, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 3, 24231, 23, 83, 0, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 4, 24232, 23, 83, 0, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 5, 24233, 24, 126, -1564, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 3, 24231, 24, 126, 0, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 4, 24232, 24, 126, 38083.7, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 5, 24233, 25, 126, 5820.2, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 3, 24231, 25, 126, 0, 0);
insert into T1 (USEYEAR, USEMONTH, LOGICMM, CUSTOMID, SALERID, ADDMONEY, LOSEMONEY)
values (2019, 4, 24232, 25, 126, 10414.4, 6711.5);

使用道具 举报

回复
论坛徽章:
540
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2019-5-14 16:16 | 显示全部楼层
就是我说的那样,自己试一下:
SELECT t1.*
      ,sum(addmoney + losemoney) over(partition by customid,salerid order by logicmm) - addmoney - losemoney as lastmoney
  FROM t1

第二个表达式也类似。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2019-5-14 17:54 | 显示全部楼层
newkid 发表于 2019-5-14 16:16
就是我说的那样,自己试一下:SELECT t1.*      ,sum(addmoney + losemoney) over(partition by customid,s ...

这样查出来的数据有问题  比如我查4月份  就会把5月份的数据也计算进去

使用道具 举报

回复
论坛徽章:
540
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2019-5-14 18:18 | 显示全部楼层
流云逸枫 发表于 2019-5-14 17:54
这样查出来的数据有问题  比如我查4月份  就会把5月份的数据也计算进去

哪一行?请具体指出来,把屏幕输出拷贝粘贴在这里。

你执行一下自己写的那个查询,再和我的比较一下。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2019-5-14 18:59 | 显示全部楼层
newkid 发表于 2019-5-14 18:18
哪一行?请具体指出来,把屏幕输出拷贝粘贴在这里。你执行一下自己写的那个查询,再和我的比较一下。

这个是我自己写的输出的5月结果

这是您写的输出的5月结果


以customid=21 为例,5月的期初应该为0

QQ截图20190514185514.jpg
QQ截图20190514185532.jpg

使用道具 举报

回复
论坛徽章:
540
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2019-5-14 19:41 | 显示全部楼层
你顶楼的公式明明是select sum(b.addmoney) + sum(b.losemoney)
到了7楼,奇迹般地把中间的加号变成了减号。然后和我的写法比较,当然对不上了,自己不会看一下公式吗?

另外,分析函数要求遍历以前月份的数据,你不能简单地加上WHERE条件。WHERE条件要放到外面去。

SELECT * FROM (
SELECT t1.*
      ,sum(addmoney - losemoney) over(partition by customid,salerid order by logicmm) - (addmoney - losemoney) as lastmoney
  FROM t1
)
WHERE usemonth=5;

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2019-5-14 19:55 | 显示全部楼层
好的   谢谢

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表