遇到一个求和问题:TA:ID,XM,GZ(姓名,基本工资)
1 小王,1000
2 小白,1200
3 小孙,1500TB:RQ, XM, JE(日期,姓名,销售额)
2009-09-01 小王, 2000
2009-09-02 小王, 2500
2009-09-03 小王, 1800
....输入时这样的:select a.id,a.xm,a.GZ,b.rq,b.jz,b.JZ*0.01
FROM TA A INNER JOIN TB B ON A.XM=B.XM
结果:
ID,XM,GZ, RQ, JE,奖励
1 小王 1000, 2009-09-01, 2000 2000*0.01
1 小王 1000, 2009-09-02 2000 2500*0.01
1 小王 1000 2009-09-03 1800 1800*0.01
2 小白 1200 2009-09-01 500, 500*0.01
2 小白 1200 2009-09-02 3800 3800*0.01
3 小孙 1500 2009-09-01 5000 5000*0.01
3 小孙 1500 2009-09-03 6200 6200*0.01问题是:需要小计时,基本工资小计出错,重复了很多,这可如何是好?
UNION
select null,SUM(GZ),NULL,SUM(JE),SUM(JE*0.01)结果,本来GZ只要支付3700,sum下来,变成了:8400
1 小王,1000
2 小白,1200
3 小孙,1500TB:RQ, XM, JE(日期,姓名,销售额)
2009-09-01 小王, 2000
2009-09-02 小王, 2500
2009-09-03 小王, 1800
....输入时这样的:select a.id,a.xm,a.GZ,b.rq,b.jz,b.JZ*0.01
FROM TA A INNER JOIN TB B ON A.XM=B.XM
结果:
ID,XM,GZ, RQ, JE,奖励
1 小王 1000, 2009-09-01, 2000 2000*0.01
1 小王 1000, 2009-09-02 2000 2500*0.01
1 小王 1000 2009-09-03 1800 1800*0.01
2 小白 1200 2009-09-01 500, 500*0.01
2 小白 1200 2009-09-02 3800 3800*0.01
3 小孙 1500 2009-09-01 5000 5000*0.01
3 小孙 1500 2009-09-03 6200 6200*0.01问题是:需要小计时,基本工资小计出错,重复了很多,这可如何是好?
UNION
select null,SUM(GZ),NULL,SUM(JE),SUM(JE*0.01)结果,本来GZ只要支付3700,sum下来,变成了:8400
FROM TA A INNER JOIN (select XM,sum(JE) from TB group by XM) B ON A.XM=B.XM
insert tb select 'RCHQ','001','2004-11-10',200000,100.00,17.00
union all select 'RCHQ','001','2004-11-10',200000,200.00,34.00
union all select 'RCHQ','001','2004-11-12',200000,150.00,25.50
union all select 'RCHQ','002','2004-11-10',200000,100.00,17.00
union all select 'RCHQ','002','2004-11-10',200000,200.00,34.00
union all select 'RCHQ','002','2004-11-12',200000,150.00,25.50
go--查询
select [DB-ID],ENTITY,DATE,[CUST-NO],AMOUNT,TAX
from(
select [DB-ID]=case
when grouping([DB-ID])=1 then '合计'
else [DB-ID] end
,ENTITY=case
when grouping([DB-ID])=1 then ''
when grouping(ENTITY)=1 then '小计'
else ENTITY end
,DATE=case
when grouping([DB-ID])=1 then ''
when grouping(ENTITY)=1 then ''
when grouping(DATE)=1 then '小计'
else DATE end
,[CUST-NO]=case
when grouping([DB-ID])=1 then ''
when grouping(ENTITY)=1 then ''
when grouping(DATE)=1 then ''
when grouping([CUST-NO])=1 then '小计'
else cast([CUST-NO] as varchar) end
,AMOUNT=sum(AMOUNT),TAX=sum(TAX)
,s1=grouping([DB-ID]),s2=[DB-ID]
,s3=grouping(ENTITY),s4=ENTITY
,s5=grouping(DATE),s6=DATE
,s7=grouping([CUST-NO]),s8=[CUST-NO]
from tb
group by [DB-ID],ENTITY,DATE,[CUST-NO] with rollup
having grouping([CUST-NO])=1
union all
select [DB-ID],ENTITY,DATE,cast([CUST-NO] as varchar),AMOUNT,TAX
,s1=0,s2=[DB-ID]
,s3=0,s4=ENTITY
,s5=0,s6=DATE
,s7=0,s8=[CUST-NO]
from tb
)a order by s1,s2,s3,s4,s5,s6,s7,s8
godrop table tb/*--测试结果
DB-ID ENTITY DATE CUST-NO AMOUNT TAX
-------- -------- ----------------- --------- -------- ---------
RCHQ 001 2004-11-10 200000 100.00 17.00
RCHQ 001 2004-11-10 200000 200.00 34.00
RCHQ 001 2004-11-10 小计 300.00 51.00
RCHQ 001 2004-11-12 200000 150.00 25.50
RCHQ 001 2004-11-12 小计 150.00 25.50
RCHQ 001 小计 450.00 76.50
RCHQ 002 2004-11-10 200000 100.00 17.00
RCHQ 002 2004-11-10 200000 200.00 34.00
RCHQ 002 2004-11-10 小计 300.00 51.00
RCHQ 002 2004-11-12 200000 150.00 25.50
RCHQ 002 2004-11-12 小计 150.00 25.50
RCHQ 002 小计 450.00 76.50
RCHQ 小计 900.00 153.00
合计 900.00 153.00
--*/
可以参考参考
工资用 SELECT SUM(GZ) FROM TA
select gz=(select sum(gz) from 表1),
je=(select sum(je) frm 表2)
as
begin
begin
declare @@counter int
set @@counter=(select count(*) from TA)
end
begin
select sum(gz)/@@counter as 基本工资总额,sum(je) as 奖金总额,sum(je*0.01) as 个人所得奖金总额
from
(select a.[id], a.xm,a.gz,b.rq,b.je,b.je*0.01 as 奖励
from TA a,TB b
where a.xm=b.xm) c
end
end