create table Student ( S# varchar(50), Sname varchar(50), Ssex varchar(2) )create table Course ( C# varchar(50), CName varchar(50), )create Table SC ( S# varchar(50), C# varchar(50), Score varchar(50) )insert into Student values (1,'张三',1); insert into Student values (2,'李四',0); insert into Student values (3,'王五',1);insert into Course values (1,'语文') insert into Course values (2,'数学')insert into SC values (1,1,90) insert into SC values (1,2,80) insert into SC values (2,1,95) insert into SC values (2,2,70) insert into SC values (3,1,85) insert into SC values (3,2,99) SELECT A.*,B.*,C.AVGSCORE FROM ( SELECT DISTINCT C.CName,S.Sname as 科目最高分姓名,SC2.S#,SC1.C#,SC1.MAXScore FROM Course C inner join (SELECT SC.C#,MAX(SC.Score) AS MAXScore FROM SC GROUP BY SC.C#) SC1 ON C.C#=SC1.C# INNER JOIN SC SC2 ON SC1.C#=SC2.C# AND SC1.MAXScore=SC2.Score INNER JOIN Student S ON S.S#=SC2.S# ) A, ( SELECT DISTINCT C.CName,S.Sname AS 科目最低分姓名,SC2.S#,SC1.C#,SC1.MINScore FROM Course C inner join (SELECT SC.C#,MIN(SC.Score) AS MINScore FROM SC GROUP BY SC.C#) SC1 ON C.C#=SC1.C# INNER JOIN SC SC2 ON SC1.C#=SC2.C# AND SC1.MINScore=SC2.Score INNER JOIN Student S ON S.S#=SC2.S# ) B ,(SELECT SC.C#,AVG(CAST(SC.Score AS DECIMAL(10,2))) AS AVGSCORE FROM SC GROUP BY SC.C#) CWHERE A.CName=B.CName AND A.C#=C.C#
用3楼的语句创建表和数据,score改成int型或其他数据型的,别用varchar了...select distinct Cname 科目,a.score1 最高成绩,d.Sname 最高成绩姓名,a.score2 最低成绩, e.sname 最低成绩姓名,a.score3 平均成绩 from (select c#,max(score) score1,min(score) score2,avg(score) score3 from sc a group by c#) a,sc b,sc c,student d,student e,course f where a.c#=b.c# and a.score1=b.score and a.score2=c.score and b.s#=d.s# and c.s#=e.s# and a.c#=f.c#如果最高成绩和最低成绩有重复的,输出的数据不太好看...
这题难道真有难度?那个叫dba什么的也没为回复?
呃,高手,其实就只有一个人回复了呀。 就是贴里的问题,问一条sql语句 看看你能不能给条简单的语句
USE test GO-->生成表t1 if object_id('t1') is not null drop table t1 Go Create table t1([学号] nvarchar(2),[姓名] nvarchar(2),[年龄] smallint,[性别] nvarchar(1)) Insert into t1 Select N'N1',N'张三',17,N'M' Union all Select N'N2',N'李四',17,N'F' Union all Select N'N3',N'王五',16,N'M' Union all Select N'N4',N'赵六',16,N'F'-->生成表t2 if object_id('t2') is not null drop table t2 Go Create table t2([课程号] nvarchar(2),[课程名] nvarchar(2)) Insert into t2 Select N'S1',N'语文' Union all Select N'S2',N'数学' Union all Select N'S3',N'英语'-->生成表t3 if object_id('t3') is not null drop table t3 Go Create table t3([学号] nvarchar(2),[课程号] nvarchar(2),[成绩] smallint) Insert into t3 Select N'N1',N'S1',53 Union all Select N'N1',N'S2',87 Union all Select N'N1',N'S3',90 Union all Select N'N2',N'S1',86 Union all Select N'N2',N'S2',75 Union all Select N'N2',N'S3',95 Union all Select N'N3',N'S1',90 Union all Select N'N3',N'S2',89 Union all Select N'N3',N'S3',92 Union all Select N'N4',N'S1',73 Union all Select N'N4',N'S2',98 Union all Select N'N4',N'S3',69 --- Sql Statement select b.课程名 ,MAX(CASE WHEN c.Nature=0 THEN c.成绩 END) AS 最高分数 ,MAX(CASE WHEN c.Nature=0 THEN a.姓名 END) AS 最高分数姓名 ,MAX(CASE WHEN c.Nature=1 THEN c.成绩 END) AS 最低分数 ,MAX(CASE WHEN c.Nature=1 THEN a.姓名 END) AS 最低分姓名 ,(SELECT AVG(成绩) FROM t3 WHERE 课程号=b.课程号) AS 平均分 from t1 AS a,t2 AS b,( SELECT 学号 ,课程号 ,成绩 ,0 AS Nature FROM t3 AS x WHERE NOT EXISTS(SELECT 1 FROM t3 WHERE 课程号=x.课程号 AND 成绩>x.成绩 ) UNION ALL SELECT 学号 ,课程号 ,成绩 ,1 FROM t3 AS x WHERE NOT EXISTS(SELECT 1 FROM t3 WHERE 课程号=x.课程号 AND 成绩<x.成绩 )
) AS cWHERE a.学号=c.学号 AND b.课程号=c.课程号 GROUP BY b.课程名,b.课程号/* 课程名 最高分数 最高分数姓名 最低分数 最低分姓名 平均分 ------- --------- ------------- --------- ----------- ------ 语文 90 王五 53 张三 75 数学 98 赵六 75 李四 87 英语 95 李四 69 赵六 86 */
(
S# varchar(50),
Sname varchar(50),
Ssex varchar(2)
)create table Course
(
C# varchar(50),
CName varchar(50),
)create Table SC
(
S# varchar(50),
C# varchar(50),
Score varchar(50)
)insert into Student values (1,'张三',1);
insert into Student values (2,'李四',0);
insert into Student values (3,'王五',1);insert into Course values (1,'语文')
insert into Course values (2,'数学')insert into SC values (1,1,90)
insert into SC values (1,2,80)
insert into SC values (2,1,95)
insert into SC values (2,2,70)
insert into SC values (3,1,85)
insert into SC values (3,2,99)
SELECT A.*,B.*,C.AVGSCORE FROM
(
SELECT DISTINCT C.CName,S.Sname as 科目最高分姓名,SC2.S#,SC1.C#,SC1.MAXScore FROM Course C
inner join
(SELECT SC.C#,MAX(SC.Score) AS MAXScore FROM SC GROUP BY SC.C#) SC1
ON C.C#=SC1.C#
INNER JOIN SC SC2 ON SC1.C#=SC2.C# AND SC1.MAXScore=SC2.Score
INNER JOIN Student S ON S.S#=SC2.S#
) A,
(
SELECT DISTINCT C.CName,S.Sname AS 科目最低分姓名,SC2.S#,SC1.C#,SC1.MINScore FROM Course C
inner join
(SELECT SC.C#,MIN(SC.Score) AS MINScore FROM SC GROUP BY SC.C#) SC1
ON C.C#=SC1.C#
INNER JOIN SC SC2 ON SC1.C#=SC2.C# AND SC1.MINScore=SC2.Score
INNER JOIN Student S ON S.S#=SC2.S#
) B ,(SELECT SC.C#,AVG(CAST(SC.Score AS DECIMAL(10,2))) AS AVGSCORE FROM SC GROUP BY SC.C#) CWHERE A.CName=B.CName AND A.C#=C.C#
呵呵,分不分的不算个啥就是看见sql的问题就想试试手,其实现在工作上用的是oracle
平时就拿sqlserver练手
from (select c#,max(score) score1,min(score) score2,avg(score) score3
from sc a group by c#) a,sc b,sc c,student d,student e,course f
where a.c#=b.c# and a.score1=b.score and a.score2=c.score and b.s#=d.s# and c.s#=e.s# and a.c#=f.c#如果最高成绩和最低成绩有重复的,输出的数据不太好看...
就是贴里的问题,问一条sql语句
看看你能不能给条简单的语句
GO-->生成表t1
if object_id('t1') is not null
drop table t1
Go
Create table t1([学号] nvarchar(2),[姓名] nvarchar(2),[年龄] smallint,[性别] nvarchar(1))
Insert into t1
Select N'N1',N'张三',17,N'M'
Union all Select N'N2',N'李四',17,N'F'
Union all Select N'N3',N'王五',16,N'M'
Union all Select N'N4',N'赵六',16,N'F'-->生成表t2
if object_id('t2') is not null
drop table t2
Go
Create table t2([课程号] nvarchar(2),[课程名] nvarchar(2))
Insert into t2
Select N'S1',N'语文'
Union all Select N'S2',N'数学'
Union all Select N'S3',N'英语'-->生成表t3
if object_id('t3') is not null
drop table t3
Go
Create table t3([学号] nvarchar(2),[课程号] nvarchar(2),[成绩] smallint)
Insert into t3
Select N'N1',N'S1',53
Union all Select N'N1',N'S2',87
Union all Select N'N1',N'S3',90
Union all Select N'N2',N'S1',86
Union all Select N'N2',N'S2',75
Union all Select N'N2',N'S3',95
Union all Select N'N3',N'S1',90
Union all Select N'N3',N'S2',89
Union all Select N'N3',N'S3',92
Union all Select N'N4',N'S1',73
Union all Select N'N4',N'S2',98
Union all Select N'N4',N'S3',69
--- Sql Statement
select
b.课程名
,MAX(CASE WHEN c.Nature=0 THEN c.成绩 END) AS 最高分数
,MAX(CASE WHEN c.Nature=0 THEN a.姓名 END) AS 最高分数姓名
,MAX(CASE WHEN c.Nature=1 THEN c.成绩 END) AS 最低分数
,MAX(CASE WHEN c.Nature=1 THEN a.姓名 END) AS 最低分姓名
,(SELECT AVG(成绩) FROM t3 WHERE 课程号=b.课程号) AS 平均分
from t1 AS a,t2 AS b,(
SELECT
学号
,课程号
,成绩
,0 AS Nature
FROM t3 AS x
WHERE NOT EXISTS(SELECT 1 FROM t3
WHERE 课程号=x.课程号 AND 成绩>x.成绩
)
UNION ALL
SELECT
学号
,课程号
,成绩
,1
FROM t3 AS x
WHERE NOT EXISTS(SELECT 1 FROM t3
WHERE 课程号=x.课程号 AND 成绩<x.成绩
)
) AS cWHERE a.学号=c.学号 AND b.课程号=c.课程号
GROUP BY b.课程名,b.课程号/*
课程名 最高分数 最高分数姓名 最低分数 最低分姓名 平均分
------- --------- ------------- --------- ----------- ------
语文 90 王五 53 张三 75
数学 98 赵六 75 李四 87
英语 95 李四 69 赵六 86
*/