数据过滤的SQl语句

笨笨熊三号 2012-11-04 02:32:37
表A、表B完全相同,表A中存学生成绩,如:
表A
ID 学生姓名 课程名称 分数
ID Sname Cname Score
1 张三 语文 88
2 张三 数学 97
3 张三 数学 98
4 李四 语文 84
5 李四 语文 88
现在要将表A中数据插入表B,要过滤掉一些重复的数据,如张三的数学成绩和李四的语文成功有一条重复数据,只保留分数最高的那一条。过滤后表B的数据为:
表B
ID 学生姓名 课程名称 分数
ID Sname Cname Score
1 张三 语文 88
2 张三 数学 98
3 李四 语文 88
...全文
148 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
极品老土豆 2012-11-04
  • 打赏
  • 举报
回复

/*
表A、表B完全相同,表A中存学生成绩,如:
表A
ID     学生姓名    课程名称    分数
ID     Sname       Cname       Score
1       张三        语文         88
2       张三        数学         97
3       张三        数学         98
4       李四        语文         84
5       李四        语文         88
现在要将表A中数据插入表B,要过滤掉一些重复的数据,如张三的数学成绩和李四的语文成功有一条重复数据,只保留分数最高的那一条。过滤后表B的数据为:
表B
ID     学生姓名    课程名称    分数
ID     Sname       Cname       Score
1       张三        语文         88
2       张三        数学         98
3       李四        语文         88 */
use xmmds
go
if(object_id('a') is not null) drop table a
go
create table a
(
id int,
sname varchar(50),
Cname varchar(50),
score int
)
go
insert into a
select 1,'张三','语文',88 union all
select 2,'张三','数学',97 union all
select 3,'张三','数学',98 union all
select 4,'李四','语文',84 union all
select 5,'李四','语文',88 
go
if(object_id('b') is not null) drop table b
go
create table b
(
id int,
sname varchar(50),
Cname varchar(50),
score int
)
go
if exists(select * from a inner join b on a.sname=b.sname and a.cname=b.cname)
  begin
   update b set score = case when b.score >a.score then b.score when b.score<a.score then a.score else b.score end
   from b inner join (select sname,cname,max(score) as score from a group by sname,cname)as a on a.sname=b.sname and a.cname=b.cname
  end
else
  begin
    insert into b(sname,cname,score)
     select sname,cname,max(score) as score
     from a  
     group by sname,cname
  end
/*(3 行受影响)*/

select sname,cname,score from b

/*
sname                                              cname                                              score
-------------------------------------------------- -------------------------------------------------- -----------
张三                                                 数学                                                 98
李四                                                 语文                                                 88
张三                                                 语文                                                 88

(3 行受影响)

*/
vileboy 2012-11-04
  • 打赏
  • 举报
回复
insert into b(Sname,Cname,Score) select Sname,Cname,max(Score) score from 表A group by Sname,Cname
  • 打赏
  • 举报
回复
with tb(id  ,Sname,Cname  , Score , CreateTime ,Other )
as 
(select 1, '张三','语文',88,'2010-01-01','' union all
select  2, '张三','数学',97,'2010-01-01','' union all
 select 3,'张三', '数学',98,'2010-01-01','' union all
 select 4,'李四', '语文',84,'2010-01-01','' union all
select 5, '李四', '语文', 88,'2010-01-01',''
)
select * from tb tb1 where id in(select id from tb tb2 where tb1.Sname=tb2.Sname and tb1.Cname=tb2.Cname and tb2.Score=
(select max(Score) from tb tb3 where tb3.Sname=tb2.Sname and tb2.Cname=tb3.Cname))
笨笨熊三号 2012-11-04
  • 打赏
  • 举报
回复
....,没人啊,只能再发一个帖子了!
笨笨熊三号 2012-11-04
  • 打赏
  • 举报
回复
引用 1 楼 josy 的回复:
SQL code12345insert into b(id,sname,cname,score)select id=row_number() over(order by getdate()), sname,cname,max(score) as scorefrom tbgroup by sname,cname
我没写清楚,ID字段是自增的,不用管,表里面还有其它字段,如 表A ID 学生姓名 课程名称 分数 时间 其它 ID Sname Cname Score CreateTime Other 有了时间、其它等一些字段,完全就不一样了
  • 打赏
  • 举报
回复
select Sname,Cname,max(Score) from 表A group by Sname,Cname
百年树人 2012-11-04
  • 打赏
  • 举报
回复
insert into b(id,sname,cname,score)
select id=row_number() over(order by getdate()),
  sname,cname,max(score) as score
from tb
group by sname,cname

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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