SQL SERVER 汇总工资, 请教各位高手(200分)

  • 主题发起人 主题发起人 sercall
  • 开始时间 开始时间
S

sercall

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi5 + MS SQL Server
表A数据量比较大,几百万条记录。

表A (工作表): WNO WDAT WGRP WHR ...
(工号) (日期) (组别) (工时)
001 01/01/2001 101 8
002 01/01/2001 101 12
...
001 01/02/2001 101 10
002 01/02/2001 101 10
...

表B (组别表): GGRP GDAT GPRT GQTY ...
(组别) (日期) (产品编号) (数量)
101 01/01/2001 888 100
101 01/02/2001 999 200
...

表C (单价表): PPRT PRIC ...
(产品编号) (单价)
888 2.0
999 1.0
...

现在 按A.WNO(工号) 统计期间工资,要求结果如下:

--期间: 01/01/2001 - 01/02/2001

WNO AMT
(工号) (金额)
001 180
002 220
...

算法: 180 = 80 + 100
(例001) = 8 * (100*2.0)/(8+12) + 10 * (200*1.0)/(10+10)
= 1号001工资 + 2号001工资
= 1号001工时 * (1号101组总金额 / 1号101组总工时)
+2号001工时 * (2号101组总金额 / 2号101组总工时)

希望大家多多指教。
谢谢!
 
你的问题有点复杂,我先把你的算法修正一下:
如工号001在01/01/2001那天的工资为他的工时占当天他所在的组的总工时的比例*该组的
数量*单价,语句如下:
Select WNO,Sum(AMT) As AMT From
(Select WNO,(WHR/Zwhr)*GQTY*PRIC As AMT From 表A,表B,表C,
(Select WDAT,WGRP,Sum(WHR) as Zwhr From 表A Group by WDAT,WGRP) As ZGS
Where 表A.WDAT=ZGS.WDAT And 表A.WGRP=ZGS.WGRP And 表A.WDAT=表B.GDAT And
表A.WGRP=表B.GGRP And 表B.GPRT=表C.PPRT) As GZB Group by WNO

该语句在Sql Server7.0调试通过
 
我由考虑了一下,用子查询和内联接更简洁一点,但用子查询好象效率会低一点。
Select WNO,Sum(AMT) As AMT From
(Select
WNO,
WHR/(Select Sum(WHR) As ZWHR From 表A as AA Where A.WDAT=AA.WDAT and A.WGRP=AA.WGRP)*GQTY*PRIC
From 表A A,表B B,表C C
Where A.WGRP=B.GGRP And A.WDAT=B.GDAT And B.GPRT=C.PPRT)
As GZB Group by WNO
 
balaschen的方法可行,速度快.
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
681
import
I
I
回复
0
查看
965
import
I
I
回复
0
查看
596
import
I
后退
顶部