首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

[]这句很难写吗

2013-06-19 
[求助]这句很难写吗?先上问题:表一班级序号班级名称1高三一班2高二三班3高一二班表二班级序号姓名语文1张

[求助]这句很难写吗?
先上问题:

表一
班级序号班级名称
1高三一班
2高二三班
3高一二班

表二
班级序号姓名语文
1张三100
1李四99
2王五98

表三
班级序号姓名数学
1张三98
2王五87
3赵六60

想要的结果
班级序号班级名称姓名语文数学合计
1高三一班张三10098198
1高三一班李四9999
2高二三班王五9897195
3高一二班赵六6060

原以为很简单,问了个软件公司搞开发的居然写出来

select 表一.班级序号,班级名称,表二.姓名,表二.语文,表三.数学,表二.语文+表三.数学 from 表一,表二,表三 where 表一.班级序号=表二.班级序号 and 表二.班级序号=表三.班级序号 and 表二.姓名=表三.姓名 order by 表一.班级序号,表二.姓名,表二.语文,表三.数学


我要的是几张表的并集,不是交集,明显不对嘛!!!

请高人指点!
[解决办法]
DECLARE @a TABLE(cId INT,NAME VARCHAR(20))
insert @a select 1,'高三一班'
union all select 2,'高二三班'
union all select 3,'高一二班'

declare @b table(cId int,Name varchar(20),Yw int)
insert @b select 1,'张三',100
union all select 1,'李四',99
union all select 2,'王五',98

declare @c table(cId int,Name varchar(20),Sx int)
insert @c select 1,'张三',98
union all select 2,'王五',87
union all select 3,'赵六',60

SELECT A.cId,a.Name,c.Name Name1,Yw,Sx,Su FROM @a a LEFT JOIN (
SELECT ISNULL(b.cId,c.cId) cId,
ISNULL(b.Name,c.Name) NAME,
Yw,
Sx,
ISNULL(Yw,0)+ISNULL(Sx,0) Su
FROM @b b FULL JOIN @c c ON b.cid=c.cid AND b.name=c.name

) c  ON a.cid=c.cid

--result
/*cId         Name                 Name1                Yw          Sx          Su          
----------- -------------------- -------------------- ----------- ----------- ----------- 
1           高三一班                 张三                   100         98          198
1           高三一班                 李四                   99          NULL        99
2           高二三班                 王五                   98          87          185


3           高一二班                 赵六                   NULL        60          60

(所影响的行数为 4 行)
*/


[解决办法]



select (case when a.班级序号 is null then b.班级序号 else a.班级序号)班级序号,
       (case when a.班级名称 is null then b.班级名称 else a.班级名称)班级名称,
       (case when a.姓名 is null then b.姓名 else a.姓名) 姓名,
       (case when a.语文 is null then 0 else a.语文) 语文,
       (case when b.数学 is null then 0 else b.数学) 数学,
       (语文 + 数学) 总分 
  from (select 表一.班级序号 班级序号,班级名称,姓名,语文 
          from 表一join 表二 
            on 表一.班级序号 =表二.班级序号) a 


  full join 
       (select 表一.班级序号 班级序号,班级名称, 姓名,数学
          from 表一 join 表三 
            on 表一.班级序号 =表三.班级序号) b 
    on a.班级序号 = b.班级序号 
   and a.姓名 = b.姓名



这个SQL语句语法有问题,改正并简化后,如下:
select isnull(a.班级序号, b.班级序号) 班级序号,
       isnull(a.班级名称, b.班级名称) 班级名称,
       isnull(a.姓名, b.姓名) 姓名,
       isnull(a.语文, 0) 语文,
       isnull(b.数学, 0) 数学,
       (isnull(语文, 0) + isnull(数学, 0)) 总分 
  from (select 表一.班级序号 班级序号,班级名称,姓名,语文 
          from 表一join 表二 
            on 表一.班级序号 =表二.班级序号) a 
  full join 
       (select 表一.班级序号 班级序号,班级名称, 姓名,数学
          from 表一 join 表三 
            on 表一.班级序号 =表三.班级序号) b 
    on a.班级序号 = b.班级序号 
   and a.姓名 = b.姓名

[解决办法]

create TABLE a(cId INT,NAME VARCHAR(20))
insert  a select 1    ,'高三一班'
union all select 2    ,'高二三班'
union all select 3    ,'高一二班'
 
create  table b(cId int,Name varchar(20),Yw int)
insert  b select 1    ,'张三',    100
union all select 1    ,'李四',    99
union all select 2    ,'王五',    98
 
create  table c(cId int,Name varchar(20),Sx int)
insert  c select 1    ,'张三',    98
union all select 2    ,'王五',    87
union all select 3    ,'赵六',    60
;with sel as(
select cid,name,yw,0 sx from b union all
select cid,name,0 yw,sx from c
),sel2 as(
select cId,Name,Yw=SUM(yw),sx=SUM(sx) from sel group by cId,Name)
select  a.cid,a.name,sel2.name,yw,sx,total=yw+sx from a join sel2 on
 a.cid=sel2.cId 

热点排行