表HS
RYID(姓名) TPM(图片名) GZL(工作量) ZLXS(质量系数)GZZY(标额) XMID
1 C1 3 4 25 1
1 C2 6 8 25 1
1 C3 5 4 25 2
2 C4 4 4 25 1
2 C5 3 6 25 2表PD
RYID(姓名)) EW1(额外1) EW2(额外2) EW3(额外3) XMID(项目名称编号)
1 2 3 5 1
1 5 5 8 1
2 5 4 6 2XMDF
XMID(项目编号) XMMC(项目名称)
1 SO
2 FDS
RYDF
RYID(人员编号) XM(姓名)
1 小哈
2 小分核算系数Q=(一个人得工作量之和+AVG(EW1)+AVG(EW2))/(所选人员的工作量之和/所选人数)+(一个人质量系数之和/一个人的图片数)+EW3
然后得到一个表
我能不能做个程序
把所有的项目都读到CHECKLISTBOX1中,然后我选择几个项目,就参与项目的人出现在CHECKLISTBOX2中,然后我又选择多个人参加核算
然后我可以得到所选人得核算系数
XM Q
1
2
该怎么做
谁能教教我?源码怎么写?
QQ59476621
RYID(姓名) TPM(图片名) GZL(工作量) ZLXS(质量系数)GZZY(标额) XMID
1 C1 3 4 25 1
1 C2 6 8 25 1
1 C3 5 4 25 2
2 C4 4 4 25 1
2 C5 3 6 25 2表PD
RYID(姓名)) EW1(额外1) EW2(额外2) EW3(额外3) XMID(项目名称编号)
1 2 3 5 1
1 5 5 8 1
2 5 4 6 2XMDF
XMID(项目编号) XMMC(项目名称)
1 SO
2 FDS
RYDF
RYID(人员编号) XM(姓名)
1 小哈
2 小分核算系数Q=(一个人得工作量之和+AVG(EW1)+AVG(EW2))/(所选人员的工作量之和/所选人数)+(一个人质量系数之和/一个人的图片数)+EW3
然后得到一个表
我能不能做个程序
把所有的项目都读到CHECKLISTBOX1中,然后我选择几个项目,就参与项目的人出现在CHECKLISTBOX2中,然后我又选择多个人参加核算
然后我可以得到所选人得核算系数
XM Q
1
2
该怎么做
谁能教教我?源码怎么写?
QQ59476621
解决方案 »
- 线程中使用了回调函数,导致内存一直增加
- 使用IdTcp组件尝试性远程屏幕传输出现意外错误、希望各位能帮助
- 高分求一继承TShape类的控件!
- 为何客户端必需得在服务端之后启动
- 如何锁定word菜单中的一项或一列?
- 请问:delphi怎么将字符或数值转ASCLL码?
- 菜鸟求救:怎样在query.sql中写带有中文查询的语句?100分
- 为什么说variant does not reference an automation object?
- 为什么我的控件注册不了面板?
- 为什么无人回答???请问_lread(api),Readfile(api),Fileread(delphi),blockread(delphi)之间的区别,以及谁的速度更快?
- 一个有趣的关于TListView删除多个节点的问题。
- 小妹跪求这么一个简单的问题.急急
sql语句写啊!! 不过你描述的太乱了.
你先把数据add到listbox中去(这里是先有一笔数据读到listbox1,然后在读取一些数据到listbox2中去),然后利用索引读取要用到的那些数据,就是利用listbox中的index值用数组把他们选出来,然后就是用你给的那个公式计算就可以了,用一个function或者是一个procedure就可以了
再给你具体点提示了,只是大概的代码,全部Copy肯定不行的。sSQL : String;
iCount : Integer;程序初始化时在ListBox1列出所有的项目
sSQL := 'Select * From XMDF';
adoQuery.SQL.Add(sSQL);
adoQuery.Open;
For iCount := 0 to adoQuery.RecordCount -1 do
Begin
ListBox1.Items.Add(adoQuery.FieldByName('XMMC').AsString);
adoQuery.Next;
End; 在ListBox1的Click事件中,将项目人员加入到Listbox2中
sSQL := Format('Select * From PD Where XMID = %d',[ListBox1.ItemIndex];
adoQuery.SQL.Add(sSQL);
adoQuery.Open;
For iCount := 0 to adoQuery.RecordCount -1 do
Begin
CheckListBox1.Items.Add(adoQuery.FieldByName('RYID).AsString);
adoQuery.Next;
End; 在ListBox2的Click事件中,获取选中的用户的相关信息,生成核算系数Q就可以了
drop procedure MyProcedure
go
create procedure MyProcedure
@ryid varchar(1000),
@xmid varchar(1000)
as
declare @abc table(
xm varchar(50) primary key,
Q int null)
insert into @abc(Q,xm)
select sum(hs.gzl)+avg(pd.ew1)+avg(pd.ew2)/sum(hs.gzl)/count(hs.ryid)+sum(hs.zlxs)/count(hs.tmp)+sum(pd.ew3) as Q
,rydf.ryid
from rydf inner join hs on rydf.ryid=hs.ryid
inner join pd on (hs.ryid=pd.ryid and
hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
where rydf.ryid in (@ryid) and xmdf.xmid in (@xmid)
group by rydf.ryid
select * from @abc
go
如果不需要存储过程
select sum(hs.gzl)+avg(pd.ew1)+avg(pd.ew2)/sum(hs.gzl)/count(hs.ryid)+sum(hs.zlxs)/count(hs.tmp)+sum(pd.ew3) as Q
,rydf.ryid
from rydf inner join hs on rydf.ryid=hs.ryid
inner join pd on (hs.ryid=pd.ryid and
hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
where rydf.ryid in (‘ryid',.....) and xmdf.xmid in ('xmid',....)
group by rydf.ryid
或者是之和呢
先谢谢先了
写那个好生复杂得SQL语句了
怎么写都不对?
你在看看吧
直接生成你要得临时表
if exists (select name from sysobjects where name='MyProcedure' and type='p')
drop procedure MyProcedure
go
create procedure MyProcedure @ryid varchar(1000),@xmid varchar(1000)
as
declare @b float
select @b=sum(hs.gzl)/count(hs.ryid)
from rydf inner join hs on rydf.ryid=hs.ryid
inner join pd on (hs.ryid=pd.ryid and
hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
where rydf.ryid in (@ryid) and xmdf.xmid in (@xmid) declare @id varchar(50) , @S float ,@Q floatdeclare MyCursor cursor
for
select sum(hs.gzl)+avg(pd.ew1)+avg(pd.ew2),sum(hs.zlxs)/count(hs.tmp)+sum(pd.ew3)
,rydf.ryid
from rydf inner join hs on rydf.ryid=hs.ryid
inner join pd on (hs.ryid=pd.ryid and
hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
where rydf.ryid in (@ryid) and xmdf.xmid in (@xmid)
group by rydf.ryidopen MyCursor
fetch next from MyCursor
into @S,@Q,@iddeclare @abc table(
xm varchar(50) primary key,
Q float null)while @@fetch_status=0
begin
insert into @abc(xm,Q) values(@id,@S/@b+@Q)
fetch next from MyCursor
into @S,@Q,@id
end;close MyCursor
deallocate MyCursorselect * from @abc
go
存储过程名:Myprocedure (可改名)
原码:
if exists (select name from sysobjects where name='MyProcedure' and type='p')
drop procedure MyProcedure
go
create procedure MyProcedure @ryid varchar(2000),@xmid varchar(2000)
as
declare @id varchar(50),@S float,@Q float,@sql1 nvarchar(4000),@sql2 nvarchar(4000)
create table #a(sm1 float)
set @sql1='insert into #a select sum(hs.gzl)/count(hs.ryid)
from rydf inner join hs on rydf.ryid=hs.ryid
inner join pd on (hs.ryid=pd.ryid and
hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
where rydf.ryid in ('+@ryid+') and xmdf.xmid in ('+@xmid+')'
exec sp_executesql @sql1
declare @tmp float
select @tmp=sm1 from #a
drop table #a create table #tbl(sm1 float,sm2 float,rid varchar(50) primary key)
set @sql2='insert into #tbl select sum(hs.gzl)+avg(pd.ew1)+avg(pd.ew2),sum(hs.zlxs)/count(hs.tmp)+sum(pd.ew3),rydf.ryid
from rydf inner join hs on rydf.ryid=hs.ryid inner join pd on (hs.ryid=pd.ryid and
hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
where rydf.ryid in ('+@ryid+') and xmdf.xmid in ('+@xmid+')group by rydf.ryid'
exec sp_executesql @sql2
declare @abc table(xm varchar(50) primary key,Q float null)
declare MyCursor cursor
for
select * from #tbl
open MyCursor
fetch next from MyCursor
into @S,@Q,@id
while @@fetch_status=0
begin
insert into @abc(xm,Q) values(@id,@S/@tmp+@Q)
fetch next from MyCursor
into @S,@Q,@id
end
close MyCursor
deallocate MyCursor
drop table #tbl
select * from @abc
go
调用示例:
exec Myprocedure ryid,xmid 如exec Myprocedure '1,2,3,4','1,2,3,4'在delphi下将生成的ryid字符串,格式如‘1,2,3,4,...’
以及xmid字符串,格式如‘1,2,3,4...'
当作参数传入TADOStoredProc中,执行即可结果:
xm, q
1 5.0
2 8.0
3 8.0
4 3.5
也要建这么多临时表吗,那游标呢?
你把email留下
[email protected]
lz是小写的
谢谢:)