表如下
姓名 课程 分数
张三 语文 88
张三 数学 78
张三 英语 54
张三 化学 66
李四 语文 49
李四 数学 57
李四 英语 62
李四 化学 70我想得到的结果是姓名 课程 分数
李四 语文 49
李四 数学 57即 列出1门以上不及格的人的不及格信息SELECT 姓名,课程,分数
FROM 成绩单
WHERE (分数 < 60)
GROUP BY 姓名
HAVING (COUNT(*) > 1)这是我写的,但是每次运行都显示列 成绩单.课程在选择列表中无效,因为该列既不包含在聚合函数中也不在group by 子句中谢谢大家帮忙
姓名 课程 分数
张三 语文 88
张三 数学 78
张三 英语 54
张三 化学 66
李四 语文 49
李四 数学 57
李四 英语 62
李四 化学 70我想得到的结果是姓名 课程 分数
李四 语文 49
李四 数学 57即 列出1门以上不及格的人的不及格信息SELECT 姓名,课程,分数
FROM 成绩单
WHERE (分数 < 60)
GROUP BY 姓名
HAVING (COUNT(*) > 1)这是我写的,但是每次运行都显示列 成绩单.课程在选择列表中无效,因为该列既不包含在聚合函数中也不在group by 子句中谢谢大家帮忙
FROM 成绩单
WHERE (分数 < 60)
GROUP BY 姓名,课程
HAVING (COUNT(*) > 1)
GO
CREATE TABLE [成绩单]([姓名] VARCHAR(10),[课程] VARCHAR(10),[分数] INT)
INSERT [成绩单] SELECT '张三','语文',88
UNION ALL SELECT '张三','数学',78
UNION ALL SELECT '张三','英语',54
UNION ALL SELECT '张三','化学',66
UNION ALL SELECT '李四','语文',49
UNION ALL SELECT '李四','数学',57
UNION ALL SELECT '李四','英语',62
UNION ALL SELECT '李四','化学',70SELECT 姓名,课程,分数
FROM 成绩单 T
WHERE 分数 < 60
AND EXISTS(SELECT 1
FROM 成绩单
WHERE 分数 < 60
AND 姓名=T.姓名
AND 分数<>T.分数)/*
姓名 课程 分数
---------- ---------- -----------
李四 语文 49
李四 数学 57(2 行受影响)
*/
select * from tb
where 成绩<60 and
姓名 in(select 姓名 from tb where 成绩<60 group by 姓名 having count(*)>1)
FROM 成绩单 T
WHERE 分数 < 60
AND EXISTS(SELECT 1
FROM 成绩单
WHERE 分数 < 60
AND 姓名=T.姓名
AND 分数<>T.分数)
SELECT 1 相当于 SELECT * ,没有特别的意思,主要是跟据后面的条件为TRUE返回结果集。
INSERT [成绩单] SELECT '张三','语文',88
UNION ALL SELECT '张三','数学',78
UNION ALL SELECT '张三','英语',54
UNION ALL SELECT '张三','化学',66
UNION ALL SELECT '李四','语文',49
UNION ALL SELECT '李四','数学',57
UNION ALL SELECT '李四','英语',62
UNION ALL SELECT '李四','化学',70SELECT T.* FROM 成绩单 T,
(SELECT 姓名 FROM 成绩单 WHERE 分数<60 GROUP BY 姓名 HAVING COUNT(1)>1) T1
WHERE T.姓名=T1.姓名 AND 分数<60
姓名 课程 分数
---------- ---------- -----------
李四 语文 49
李四 数学 57(所影响的行数为 2 行)