[求助]这句很难写吗?
先上问题:
表一
班级序号班级名称
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