简单的数据库,简单的表结构,简单的数据。-- 但这个SQL如何写,各位大侠请进,奉送300分。 (300分)

  • 主题发起人 主题发起人 白衣书生
  • 开始时间 开始时间

白衣书生

Unregistered / Unconfirmed
GUEST, unregistred user!
各位好: 数据库是Access,表结构如下:
月份:month 姓名:name 工作量:work 完工否:end (是-Y,否-N)
数据如下:
month name work end
7 A 1 Y
7 B 1 N
7 C 1 Y
8 A 1 Y
8 B 1 N
8 C 1 N
9 A 1 N
9 B 1 Y
9 C 1 Y
每月的数据都在这张表中,要求按月统计“每人当月已经完工的工作量(没有完工的累计到下个月,直到完工为止)”,得到结果如下:
7月的统计结果: month name work
7 A 1
7 B 0
7 C 1
8月的统计结果: month name work
8 A 1
8 B 0
8 C 0
9月的统计结果: month name work
9 A 0
9 B 2
9 C 3
不好意思,怕描述问题不清,所以列出了上面的数据。 这个SQL语句的条件怎么写?
按月统计“每人当月已经完工的工作量(没有完工的累计到下个月,直到完工为止)”, 当月完工的好说,关键还要累计上月没有完工的工作量。
还请各位大侠指教。
另,是否这样建表有缺陷?还请有经验的FW说话指导。 谢谢。
 
请帮忙提前,谢谢。
 
缺少一个"完工日期"字段。想一想?
 
有问题,有问题。按你现成的东西做到你要求的不难。但有两个情况:
一是跨年度的问题,本年的一月的上月就是上年的十二月。你没有年份资料,如果确认?
二是,如果上月未完成,本月仍未完成,或者是长期未完成呢?
 

嗯,除上面所说的,需不需要加上最终期限。
 
改造后的表结构建议如下:
NAME 名字
BEGINDATE 开始日期
ENDDATE 完成日期
WORK 工作量
SQL语句如下:
SELECT Month([ENDDATE]) AS [Month], NAME, Sum(WORK) AS WORKSUM
FROM 你的表
GROUP BY Month([ENDDATE]), NAME
 
看来开始日期好象没用,不过要保留做记录用。
有了完工日期,那么,以完工日期为准,不管它是什么日期开始的,本月完成,工作量就
计入本月。
这样就不用考虑跨年度问题和长期未完成的问题了。
而且,完整的日期型字段,在查询中用函数来提取月份(甚至可以提取年份,日期,日期)
就比原来用整型字段记录月份要灵活的多。
 
谢谢楼上各位指点。
我是将问题简化了。我用month来表示了一下,其实这是个“日期时间型”的,可以如 2002-8-1 这样的日期的。

to smallbs:不需要“完工日期”,就是为了统计当月的,所以才加上了 end 字段。

to oceanwave:“本年的一月的上月就是上年的十二月”这的确是个问题,但我的month可以有年、月、日的。
“上月未完成,本月仍未完成,或者是长期未完成呢”--那么按要求当月统计为0。一直累计直到完工为止。
“按你现成的东西做到你要求的不难。”--还请老兄指点。

to 影子: “最终期限”?为什么? 我只是需标注当月完工的情况,累计已经完工的工作量--Y:累计和;N:累计为0,就这么简单。
 
to oceanwave :
多谢兄台指点。 谢谢。
看了兄台的回复。表结构是取消了end 标志。改为“完工日期”,我正在琢磨。
----
兄台的思路和我的不一样,你的表结构的确这样大大简化了SQL。
实际情况是这样的,每月有工作单,当月上交,当月统计,只统计当月完工情况(包括上月对应的没有完工的也累计进当月)。
 
to smallbs:多谢!
 
至少也得加一个年份字段,如此说来,还是加一个“实际完工日期”字段更方便,呵呵!
或者将 month 改成“日期时间型”也行啊!把 oceanwave 的改一下即可。
 
假如表结构不变,month是“日期时间型”的,这个 SQL 能写吗?

to smallbs:是“日期时间型”,有年份的。
 
select distinct month,name,
(select sum(work) from table1
where month<AAA.month and name=AAA.name and end='N') as tmp,
iif(end='N',0,work+iif(isnull(tmp)=-1,0,tmp)) as endwork
from table1 AAA
where month=Tmon

Tmon=7得到
month name tmp endwork
7 A 1
7 B 0
7 C 1

Tmon=8得到
month name tmp endwork
8 A 1
8 B 1 0
8 C 0

Tmon=9得到
month name tmp endwork
9 A 0
9 B 2 3
9 C 1 2

用NZ函数来判断是否为null
select distinct month,name,
(select sum(work) from table1
where month<AAA.month and name=AAA.name and end='N') as tmp,
iif(end='N',0,work+nz(tmp,0)) as endwork
from table1 AAA
where month=Tmon
 
to QuickSilver:多谢大哥,十分感激。 我去试试。
 
iif函数是干什么的呀 我怎么没有查到?
 
iif(条件,条件为真返回值,条件为假返回值)

A=1,B=2
iif(A>B,A,B)
结果为B

刚才给出的SQL语句我想了想还是不行的,在数据多的情况下会出错的,还要再修改才行

7 A N
8 A Y
9 A N
10 A Y

在10月统计的话就会出错了
 
select month,name,(select sum(work)
from table1
where month>nz(BBB.lastym,0) and
month<BBB.month and
name =BBB.name and
end ='N') as tmp,
iif(end='N',0,work+nz(tmp,0)) as endwork
From (select month,name,work,end,
(select top 1 month
from table1
where month<AAA.month and name =AAA.name and end ='Y'
order by month desc) as lastym
from table1 AAA) BBB
Where month=9

lastym指当前月份前最后的end='Y'时的month值
还是照楼上的弟兄们所说的改一改结构吧
 
[:(] 没治了??
 
没治了?什么意思?兄弟都已经提示的很清楚了,有表格,有SQL,应该很清楚了吧?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部