一个棘手的问题,向老大提问

muzhenxing013 2009-06-03 04:50:30
举例说明:员工档案表,员工工资表。表结构:
员工档案表:人员id,员工名称。
员工工资表:人员id,月份,工资;
名次解释:
同期:员工张三2008年5月份的工资的同期就是员工张三2007年5月份的工资(就是去年同时段收入);
当期:就是员工当月的收入。
同期累计:就是员工员工2007开始到2007年五月份的和
当期累计:就是员工员工2008开始到2008年五月份的和
现在存在这样的问题,如果员工张三只在公司干了一个月,就是说张三在2007年5月份入职干了一个月离职,那么在工资表里只有一行记录。但是这个员工2007-06,2007-07,2007-08。。。。。。2007-12的累计收入都有啊,而且2008年5月份他的同期收入也有啊(就是2007-05份)。那么怎么求它的当期累计,同期,同期累计。比如说公司里经营A产品,A产品只在2008-05份买过,一直都没买,在统计的过程中,这个产品 2007-06,2007-07,2007-08。。。。。。2007-12 都是有累计销量的,而且在2008-05月份这个产品是有同期销量的,就是其实在业务数据库值存在一条数据,但是这些业务形态确实存在,向老大和各位请教。
(以上都是虚拟环境)
现在的解决方案:
把员工id和时间对应表(就是从2007-01-01到2008-01-01的所有时间)做基卡尔积,
这样出来的员工id和时间的对应是最全的,用写函数到员工表里匹配,如果匹配上了,用函数来算他的同期,当期,同期累计,当期累计。但是这样子很慢,一个表有2亿行。一个表有4万多行,这样子执行结果就出来,所以寻求更好的思路
...全文
209 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2009-06-07
  • 打赏
  • 举报
回复
还是有错,把方法改一下,再次订正:
[code=SQL--求2008年每个员工每个月的同期累计和当期累计
create table months(m varchar(7),m1 varchar(7))
insert into months select '2008-01','2007-01' union all select '2008-02','2007-02' union all select '2008-03','2007-03' union all select '2008-04','2007-04' --......一直到'2008-12'
go
select c.员工id,c.员工名称,a.m as 月份,
(select isnull(工资,0) from 员工工资表 where 月份=a.m1 and 员工id=c.员工id) as 同期,
(select sum(isnull(工资,0)) from 员工工资表 where 月份<=a.m1 and 月份>='2007-01' and 员工id=c.员工id) as 同期累计,
isnull(b.工资,0) as 当期,
(select sum(isnull(工资,0)) from 员工工资表 where 月份<=a.m and 月份>='2008-01' and 员工id=c.员工id) as 当期累计
from months a left join 员工工资表 b on a.m=b.月份 right join 员工档案表 c on b.员工id=c.员工id
where a.m > '2007-12'
[/code]
-晴天 2009-06-07
  • 打赏
  • 举报
回复
有个小错,订正:
--求每个员工每个月的同期累计和当期累计
create table months(m varchar(7))
insert into months select '2007-01' unoin all select '2007-02' union all select '2007-03' union all --......一直到'2008-12'
go
select a.m,c.员工id,
isnull(b.工资,0) as 同期,
(select sum(isnull(工资,0)) from 员工工资表 where 月份<=a.m and 月份>='2007-01' and 员工id=c.员工id) as 同期累计,
(select isnull(工资,0) from 员工工资表 where 月份='2008-' + right(a.m,2) and 员工id=c.员工id) as 当期,
(select sum(isnull(工资,0)) from 员工工资表 where 月份<='2008-' + right(a.m,2) and 月份>='2008-01' and 员工id=c.员工id) as 当期累计,
from months a left join 员工工资表 on a.m=b.月份 right join 员工档案表 c on b.员工id=c.员工id
where a.m like '2007-%' and b.月份

-晴天 2009-06-07
  • 打赏
  • 举报
回复
干吗要用函数或者游标?
--求每个员工每个月的同期累计和当期累计
create table months(m varchar(7))
insert into months select '2007-01' unoin all select '2007-02' union all select '2007-03' union all --......一直到'2008-12'
go
select c.员工id,a.m as 月份,
isnull(b.工资,0) as 同期,
(select sum(isnull(工资,0)) from 员工工资表 where 月份<=a.m and 月份>='2007-01' and 员工id=c.员工id) as 同期累计,
(select isnull(工资,0) from 员工工资表 where 月份='2008-' + right(a.m,2) and 员工id=c.员工id) as 当期,
(select sum(isnull(b.工资),0) from 员工工资表 where 月份<='2008-' + right(a.m,2) and 月份>='2008-01' and 员工id=c.员工id) as 当期累计,
from months a left join 员工工资表 on a.m=b.月份 right join 员工档案表 c on b.员工id=c.员工id
where a.m like '2007-%' and b.月份

楼主试试这样是否还要运行十个小时.
kendyhxl 2009-06-06
  • 打赏
  • 举报
回复
up
jiangzehong 2009-06-06
  • 打赏
  • 举报
回复
up
freedom36 2009-06-06
  • 打赏
  • 举报
回复
up
--小F-- 2009-06-06
  • 打赏
  • 举报
回复
...不会
fcuandy 2009-06-03
  • 打赏
  • 举报
回复
没有什么好办法。因为业务需要。

如果业务要求有更改,只求某个员工最初记录与最末记录间的数据,那么计算量应该会少很多。
ai_li7758521 2009-06-03
  • 打赏
  • 举报
回复
坐等老大
MJunnnn 2009-06-03
  • 打赏
  • 举报
回复
小梁 爱 兰儿
claro 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liangCK 的回复:]
看看老大.
[/Quote]
muzhenxing013 2009-06-03
  • 打赏
  • 举报
回复
现在这个表已经分了24个区,存在不同的硬盘上,而且正在oracle 10g也在测试,create tablespace test datafile 'e:\test1.dat' size 1024M;建立1g的表空间。求高人有好的思路和算法
muzhenxing013 2009-06-03
  • 打赏
  • 举报
回复


create table 员工档案表 ( id int ,名称 varchar(100) );
insert into 员工档案表
select 1,'张三' union all
select 2,'李四' union all
select 3,'王麻子'
go
create table 员工工资表( id int, riqi datetime , gz money)
insert into 员工工资表
select 1,'2008-05-01',$500

求,这个员工2008年6分月,7月份。。。。。。。。。12月份的累计收入,2009年5月份这个员工的同期收入。这是虚拟的测试数据,我们各个零售、批发行业的商务智能的
WtAndJava 2009-06-03
  • 打赏
  • 举报
回复
复杂
usher_gml 2009-06-03
  • 打赏
  • 举报
回复
难,帮顶
hhnick 2009-06-03
  • 打赏
  • 举报
回复
把需要的数据先导出到临时表上,再计算
oopp1234567890 2009-06-03
  • 打赏
  • 举报
回复
坐等
liangCK 2009-06-03
  • 打赏
  • 举报
回复
看看老大.
muzhenxing013 2009-06-03
  • 打赏
  • 举报
回复
如果按照我的思路用游标要循环2亿次,用函数也可能需要10个小时以上

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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