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

  • 主题发起人 主题发起人 白衣书生
  • 开始时间 开始时间
to oceanwave:
改造后的表结构建议如下:
NAME 名字
BEGINDATE 开始日期
ENDDATE 完成日期
WORK 工作量
SQL语句如下:
SELECT Month([ENDDATE]) AS [Month], NAME, Sum(WORK) AS WORKSUM
FROM 你的表
GROUP BY Month([ENDDATE]), NAME
======================================================

基本同意你的观点,但如果工作量是一月来计算, 工作量的字段可以不要
NAME 名字
BEGINDATE 开始日期
ENDDATE 完成日期
END 完工标志(因为未完工前, ENDDATE无法确定,由他,可以把ENDDATE看成当前日起)
sql:
select Month(ENDDATE) AS [Month], NAME, IIF(END, DATEDIFF('M', BEGINDATE, ENDDATE), 0) AS WORK
FROM TABLEWORK
WHERE YEAR(ENDDATE) = QUERYYEAR AND MONTH(ENDDATE) = QUERYMONTH

如果每月工作量不同:

SELECT MONTH(A.ENDDATE) AS [MONTH], A.NAME, IIF(END, (SELECT SUM(B.WORK) FROM TABLEWORK B WHERE B.ENDDATE BETWEEN A.BEGINDATE AND A.ENDDATE AND B.NAME=A.NAME), 0) AS MWORK
FROM TABLEWORK A
WHERE YEAR(ENDDATE) = QUERYYEAR AND MONTH(ENDDATE) = QUERYMONTH


 

我所说的最终期限是最后完成任务的期限。一个任务总不可能无休止地下去。
 
多谢各位指点!谢谢,谢谢!
以上建议我会认真分析的。
-----------------------
昨天在Access中调试一个SQL时,这样写
with ADOQuery do
begin
Close;
SQL.Clear;
SQL.Add('select sum()...form ..where ..group by..'); //整个SQL写在一行
Open;
end;
---------------运行没有问题
这样写:
with ADOQuery do
begin
Close;
SQL.Clear;
SQL.Add('select sum()...'); //分行写
SQL.Add('form ..where ..');
SQL.Add('group by..');
Open;
end;
-------在IDE中运行老是出错:“Access violation at address XXXXX in module 'msjet40.dll'.Read of address XXXXXX”。

而只运行EXE不会有问题的,我的SQL语句在 Explore 中已经测试没有问题的!
现在还是这个样子的,我头大。 为什么不能SQL.Add()分行写?
不加上Sum()函数是没有问题的,加上了Sum()函数分行写,就会出现错误提示!
奇怪! 是我的ADO驱动的问题吗? 要打补丁吗?? 望指点。
 
要留意 form 的前面有一空格,
 
Form 改为 From 试试
 
笔误笔误,是from。
我发现只要在sum()函数后断行,就会出现错误。奇了怪了。
 
那就如lyq2276959所说的注意一下空格的问题
在每一句sql.add('.....')里的字符串尾部加上一个空格
 
表设计的有点问题,实际上没有必要设置end字段,还是通过工作结束日期来判断,凡在当
月结束的工作就可以将前几个月的进行累加。建议设置工作开始日期,这对以后万一要进
行个人工作统计等工作评价会大有好处的。
 

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
后退
顶部