请问这样的SQL语句如何写?——急!

dustwoo 2003-11-18 07:46:59
请问这样的SQL语句如何写?

A表:
学号 年级 学期 书费 杂费
1 1 1 100 50
1 1 2 200 50
2 1 1 150 30
2 1 2 200 80
B表:
学号 年级 学费
1 1 500
2 1 300

我想要的结果是这样的:
学号 年级 书费 杂费 学费 总费用
1 1 300 100 500 900
2 1 350 110 300 760

请各位多多帮忙,先谢过了。
...全文
53 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dustwoo 2003-11-18
  • 打赏
  • 举报
回复
谢谢各位捧场,小弟今天又是获益匪浅。
pengdali 2003-11-18
  • 打赏
  • 举报
回复
Select a.*,b.学费,a.书费+a.杂费+b.学费 总费用 from (select 学号,年级,sum(书费) 书费,sum(杂费) 杂费,sum(书费) 书费 from a group by 学号,年级) a join b on a.学号=b.学号
tohen163 2003-11-18
  • 打赏
  • 举报
回复
select A.學號,A.年級, sum(A.書費) as 書費,sum(A.雜費) as 雜費,B.學費,書費+雜費 as 總費用
from A表 A,B表 B
where A.學號=B.學號 and A.年級=B.年級
group by A.學號,A.年級
pengdali 2003-11-18
  • 打赏
  • 举报
回复
Select a.学号,a.年级,isnull(sum(a.书费),0) 书费,isnull(sum(a.杂费),0) 杂费,b.学费,isnull(sum(a.书费),0)+isnull(sum(a.杂费),0)+isnull(b.学费,0) 总费用 from a left join b on a.学号 = b.学号 group by a.学号,a.年级,b.学费
txlicenhe 2003-11-18
  • 打赏
  • 举报
回复

create table t1(学号 int,年级 int,学期 int,书费 int,杂费 int)
insert t1 Select 1, 1 , 1, 100 , 50
union all select 1 , 1 , 2 , 200 , 50
union all select 2 , 1 , 1 , 150 , 30
union all select 2 , 1, 2 , 200, 80

create table t2 (学号 int,年级 int,学费 int)
insert t2 values(1,1,500)
insert t2 values(2,1,300)

Select a.学号,a.年级,sum(a.书费) as 书费,sum(a.杂费) as 杂费,b.学费,sum(a.书费)+sum(a.杂费)+b.学费 as 总费用
from t1 a
left join t2 b on a.学号 = b.学号
group by a.学号,a.年级,b.学费
学号 年级 书费 杂费 学费 总费用
----------- ----------- ----------- ----------- ----------- -----------
1 1 300 100 500 900
2 1 350 110 300 760

(所影响的行数为 2 行)

zjcxc 元老 2003-11-18
  • 打赏
  • 举报
回复
--下面是数据测试:

--创建数据测试环境
declare @A表 table(学号 int,年级 int,学期 int,书费 int,杂费 int)
insert into @A表
select 1,1,1,100,50
union all select 1,1,2,200,50
union all select 2,1,1,150,30
union all select 2,1,2,200,80

declare @B表 table(学号 int,年级 int,学费 int)
insert into @B表
select 1,1,500
union all select 2,1,300



--方法1,可能某个学号只在一个表中出现的情况
select a.*,b.学费,总费用=a.书费+a.杂费+b.学费
from(
select 学号,年级,书费=sum(书费),杂费=sum(杂费)
from @A表 group by 学号,年级
) a join(
select 学号,年级,学费=sum(学费)
from @B表 group by 学号,年级
) b on a.学号=b.学号 and a.年级=b.年级

--方法2,可能某个学号只在一个表中出现的情况
select 学号=isnull(a.学号,b.学号)
,年级=isnull(a.年级,b.年级)
,书费=isnull(a.书费,0)
,杂费=isnull(a.杂费,0)
,学费=isnull(b.学费,0)
,总费用=isnull(a.书费,0)+isnull(a.杂费,0)+isnull(b.学费,0)
from(
select 学号,年级,书费=sum(书费),杂费=sum(杂费)
from @A表 group by 学号,年级
) a join(
select 学号,年级,学费=sum(学费)
from @B表 group by 学号,年级
) b on a.学号=b.学号 and a.年级=b.年级


/*--测试结果:

学号 年级 书费 杂费 学费 总费用
----------- ----------- ----------- ----------- ----------- -----------
1 1 300 100 500 900
2 1 350 110 300 760

(所影响的行数为 2 行)

学号 年级 书费 杂费 学费 总费用
----------- ----------- ----------- ----------- ----------- -----------
1 1 300 100 500 900
2 1 350 110 300 760

(所影响的行数为 2 行)
--*/
zjcxc 元老 2003-11-18
  • 打赏
  • 举报
回复
--没有经过详细考虑,上面的是错的.正确的应该是:

--方法1,每个学号都会在两个表中出现的处理方法
select a.*,b.学费,总费用=a.书费+a.杂费+b.学费
from(
select 学号,年级,书费=sum(书费),杂费=sum(杂费)
from @A表 group by 学号,年级
) a join(
select 学号,年级,学费=sum(学费)
from @B表 group by 学号,年级
) b on a.学号=b.学号 and a.年级=b.年级


--方法2,可能某个学号只在一个表中出现的情况
select 学号=isnull(a.学号,b.学号)
,年级=isnull(a.年级,b.年级)
,书费=isnull(a.书费,0)
,杂费=isnull(a.杂费,0)
,学费=isnull(b.学费,0)
,总费用=isnull(a.书费,0)+isnull(a.杂费,0)+isnull(b.学费,0)
from(
select 学号,年级,书费=sum(书费),杂费=sum(杂费)
from @A表 group by 学号,年级
) a join(
select 学号,年级,学费=sum(学费)
from @B表 group by 学号,年级
) b on a.学号=b.学号 and a.年级=b.年级

zjcxc 元老 2003-11-18
  • 打赏
  • 举报
回复
--上面的语句考虑了可能某个学号只在一个表中出现的情况,如果每个学号都会在两个表中出现,就用:

select a.学号,a.年级
,书费=sum(a.书费)
,杂费=sum(a.杂费)
,学费=sum(b.学费)
,总费用=sum(isnull(a.书费,0)+isnull(a.杂费,0)+isnull(b.学费,0))
from A表 a join B表 b on a.学号=b.学号
group by a.学号,a.年级
zjcxc 元老 2003-11-18
  • 打赏
  • 举报
回复
--上面的语句忘了写group,改一下:
select 学号=isnull(a.学号,b.学号)
,年级=isnull(a.年级,b.年级)
,书费=sum(a.书费)
,杂费=sum(a.杂费)
,学费=sum(b.学费)
,总费用=sum(isnull(a.书费,0)+isnull(a.杂费,0)+isnull(b.学费,0))
from A表 a
full join B表 b on a.学号=b.学号
group by isnull(a.学号,b.学号),isnull(a.年级,b.年级)
zjcxc 元老 2003-11-18
  • 打赏
  • 举报
回复
select 学号=isnull(a.学号,b.学号)
,年级=isnull(a.年级,b.年级)
,书费=sum(a.书费)
,杂费=sum(a.杂费)
,学费=sum(b.学费)
,总费用=sum(isnull(a.书费,0)+isnull(a.杂费,0)+isnull(b.学费,0))
from A表 a
full join B表 b on a.学号=b.学号

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧