select a.学号,a.姓名,b.科目,b.成绩 from student a left join score b on a.学号=b.学号 and b.成绩>=60 order by b.科目
SELECT a.学号,a.姓名,a.性别,b.科目,b.成绩 FROM student a,score b WHERE a.学号 = b.学号 AND a.学号 IN (SELECT 学号 FROM score WHERE Math >= 60) ORDER BY (SELECT English FROM score WHERE 学号 = a.学号)
但是要求是数学及格的学生,按照英语成绩排序啊?最后出来的recordSet如下学号, 姓名,性别 Math, English, Physics 101 test1 m 60 70 63 103 test3 m 75 72 88如果还想按照性别,或者姓名排序呢?Thanks in advance.
-- 剛才有错。 SELECT a.学号,a.姓名,a.性别,b.科目,b.成绩 FROM student a,score b WHERE a.学号 = b.学号 AND a.学号 IN (SELECT 学号 FROM score WHERE 成绩 >= 60 AND 科目 = 'Math') ORDER BY (SELECT English FROM score WHERE 学号 = a.学号)
SELECT English FROM score WHERE 学号 = a.学号 好像不对啊?
你最后得到的是这样的: 学号 姓名 性别 学科 成绩 101 test1 m Math 60 101 test1 m English 70 ...? 还是这样的: 学号 姓名 性别 Math Enghlish Physics 101 test1 m 60 80 80 ...? 如果是第二种,那么使用简单的查询肯定不行,必须使用临时表。
如果是第二种,那么对应的OLTP应该是: select 学号 into #Temp1 from score where 科目 = 'Math' and 成绩 >= 60 select #Temp1.学号, student.姓名, student.性别, 0 as Math, 0 as English, 0 as Physics into #Temp2 from #Temp1, student where #Temp1.学号 = student.学号 update #Temp2 set Math = score.成绩 from score where #Temp2.学号 = score.学号 and score.科目 = 'Math' update #Temp2 set English = score.成绩 from score where #Temp2.学号 = score.学号 and score.科目 = 'English' update #Temp2 set Physics = score.成绩 from score where #Temp2.学号 = score.学号 and score.科目 = 'Physics' select * from #Temp2 order by English drop table #temp1 drop table #temp2
To luco (luco): 要是我的正确,请给我分,我都快穷死了。
不是很对阿,如果add科目种类的话,sql语句要一直改啊。我想可能要两次,先找出学号,然后在score里找出他的所有科目成绩。any, give u 10 scores firstly.
CREATE TABLE #student(学号 varchar(20),姓名 varchar(20),性别 varchar(20)) INSERT #student SELECT '101','test1','m' UNION ALL SELECT '102','test2','f' UNION ALL SELECT '103','test3','m' GOCREATE TABLE #score(学号 varchar(20),科目 varchar(20),成绩 int) INSERT #score SELECT '101','Math',60 UNION ALL SELECT '101','English',70 UNION ALL SELECT '101','physics',63 UNION ALL SELECT '102','Math',45 UNION ALL SELECT '102','English',90 UNION ALL SELECT '102','physics',76 UNION ALL SELECT '103','Math',75 UNION ALL SELECT '103','English',72 UNION ALL SELECT '103','physics',88 GODECLARE @sql varchar(8000) SET @sql = 'SELECT b.*,a.* FROM (' SET @sql = @sql+'SELECT 学号' SELECT @sql = @sql+ ',sum(CASE 科目 WHEN '''+科目+''' THEN 成绩 END) ' + 科目 from (SELECT DISTINCT 科目 FROM #score) a SET @sql = @sql+' FROM #score ' SET @sql = @sql+' GROUP BY 学号' SET @sql = @sql+') a,#student b WHERE a.学号 = b.学号 AND math >= 60' SET @sql = @sql+' ORDER BY English' EXEC (@sql) GODROP TABLE #student,#score GO
以上是动态sql语句实现的,可以支持多个科目。 结果如下:学号 姓名 性别 学号 English Math physics -------------------- -------------------- ------------- 101 test1 m 101 70 60 63 103 test3 m 103 72 75 88
To luco(luco): 我的代码是不是你的意思?
-- 类似的问题论坛上有好多,楼主搜索一下动态sql就知道了。再给你帖一个比较好的例子: /* 原表: name km cj ---------- ---------- ----------- 张三 语文 80 张三 数学 86 张三 英语 75 李四 语文 78 李四 数学 85 李四 英语 78目标表: 姓名 数学 英语 语文 总分 ---------- ---------- ----------- ----------- ----------- 李四 85 78 78 241 张三 86 75 80 241 */create table #test (name varchar(10),km varchar(10),cj int) insert #test select '张三','语文',80 union all select '张三','数学',86 union all select '张三','英语',75 union all select '李四','语文',78 union all select '李四','数学',85 union all select '李四','英语',78 go select * from #testselect name 姓名, sum(case km when '语文' then cj end) 语文, sum(case km when '数学' then cj end) 数学, sum(case km when '英语' then cj end) 英语, sum(cj) 总分 from #test group by namedeclare @sql varchar(8000) set @sql='select name 姓名' select @sql= @sql+ ',sum(case km when '''+km+''' then cj end) ' + km from (select distinct km from #test) a set @sql=@sql+',sum(cj) 总分 from #test group by name' exec (@sql) go drop table #test
To luco(luco): 你不能把你的意思一下子说完?!!!!!!!!!!! 真是笨!!!!!!!!!! 搞得前面的一帮子兄弟辛辛苦苦搞了半天,其实连意思都不对!!!!!!
FROM student a,score b
WHERE a.学号 = b.学号
AND a.学号 IN
(SELECT 学号 FROM score WHERE Math >= 60)
ORDER BY
(SELECT English FROM score WHERE 学号 = a.学号)
101 test1 m 60 70 63
103 test3 m 75 72 88如果还想按照性别,或者姓名排序呢?Thanks in advance.
SELECT a.学号,a.姓名,a.性别,b.科目,b.成绩
FROM student a,score b
WHERE a.学号 = b.学号
AND a.学号 IN
(SELECT 学号 FROM score WHERE 成绩 >= 60 AND 科目 = 'Math')
ORDER BY
(SELECT English FROM score WHERE 学号 = a.学号)
好像不对啊?
学号 姓名 性别 学科 成绩
101 test1 m Math 60
101 test1 m English 70
...?
还是这样的:
学号 姓名 性别 Math Enghlish Physics
101 test1 m 60 80 80
...?
如果是第二种,那么使用简单的查询肯定不行,必须使用临时表。
select 学号 into #Temp1 from score where 科目 = 'Math' and 成绩 >= 60
select #Temp1.学号, student.姓名, student.性别, 0 as Math, 0 as English, 0 as Physics into #Temp2 from #Temp1,
student where #Temp1.学号 = student.学号
update #Temp2 set Math = score.成绩 from score where #Temp2.学号 = score.学号 and score.科目 = 'Math'
update #Temp2 set English = score.成绩 from score where #Temp2.学号 = score.学号 and score.科目 = 'English'
update #Temp2 set Physics = score.成绩 from score where #Temp2.学号 = score.学号 and score.科目 = 'Physics'
select * from #Temp2 order by English
drop table #temp1
drop table #temp2
要是我的正确,请给我分,我都快穷死了。
INSERT #student
SELECT '101','test1','m'
UNION ALL SELECT '102','test2','f'
UNION ALL SELECT '103','test3','m'
GOCREATE TABLE #score(学号 varchar(20),科目 varchar(20),成绩 int)
INSERT #score
SELECT '101','Math',60
UNION ALL SELECT '101','English',70
UNION ALL SELECT '101','physics',63
UNION ALL SELECT '102','Math',45
UNION ALL SELECT '102','English',90
UNION ALL SELECT '102','physics',76
UNION ALL SELECT '103','Math',75
UNION ALL SELECT '103','English',72
UNION ALL SELECT '103','physics',88
GODECLARE @sql varchar(8000)
SET @sql = 'SELECT b.*,a.* FROM ('
SET @sql = @sql+'SELECT 学号'
SELECT @sql = @sql+ ',sum(CASE 科目 WHEN '''+科目+''' THEN 成绩 END) ' + 科目 from (SELECT DISTINCT 科目 FROM #score) a
SET @sql = @sql+' FROM #score '
SET @sql = @sql+' GROUP BY 学号'
SET @sql = @sql+') a,#student b WHERE a.学号 = b.学号 AND math >= 60'
SET @sql = @sql+' ORDER BY English'
EXEC (@sql)
GODROP TABLE #student,#score
GO
结果如下:学号 姓名 性别 学号 English Math physics
-------------------- -------------------- -------------
101 test1 m 101 70 60 63
103 test3 m 103 72 75 88
我的代码是不是你的意思?
/*
原表:
name km cj
---------- ---------- -----------
张三 语文 80
张三 数学 86
张三 英语 75
李四 语文 78
李四 数学 85
李四 英语 78目标表:
姓名 数学 英语 语文 总分
---------- ---------- ----------- ----------- -----------
李四 85 78 78 241
张三 86 75 80 241
*/create table #test (name varchar(10),km varchar(10),cj int)
insert #test select '张三','语文',80
union all select '张三','数学',86
union all select '张三','英语',75
union all select '李四','语文',78
union all select '李四','数学',85
union all select '李四','英语',78
go
select * from #testselect name 姓名,
sum(case km when '语文' then cj end) 语文,
sum(case km when '数学' then cj end) 数学,
sum(case km when '英语' then cj end) 英语,
sum(cj) 总分
from #test group by namedeclare @sql varchar(8000)
set @sql='select name 姓名'
select @sql= @sql+ ',sum(case km when '''+km+''' then cj end) ' + km from (select distinct km from #test) a
set @sql=@sql+',sum(cj) 总分 from #test group by name'
exec (@sql)
go
drop table #test
你不能把你的意思一下子说完?!!!!!!!!!!!
真是笨!!!!!!!!!!
搞得前面的一帮子兄弟辛辛苦苦搞了半天,其实连意思都不对!!!!!!
你可以看一下我发的帖子之前几个兄台:poka(poka) ,sharkabc(shark),gmlxf(烛光)的帖子,他们查询语句生成的列(Column,正式文献中叫Attributes,可能说“题头”你最清楚)都不正确,所以根本不可能符合你的要求。是那三个兄台不懂汉语,还是你自己叙述不清?gmlxf(烛光)这个兄台的水平很高,后来写出了很New B的查询语句。所以我认为是你叙述不清,后来我的帖子中也提问了你到底应该是哪种生成结果。
你的需求没有一下子提完全,是可以肯定的了。我说你起始的需求叙述“不清”,并非错误,否则,我也不可能从中查出端倪。