新手求助:如何根据条件进行排名

xfy8xfy8 2012-10-12 09:32:42
有这样一张表:
DROP TABLE IF EXISTS `sheet1`;
CREATE TABLE `sheet1` (
`biaozhi` varchar(6) DEFAULT NULL,
`name` varchar(8) DEFAULT NULL,
`bj` varchar(2) DEFAULT NULL,
`zf` int(11) DEFAULT NULL,
`MC` varchar(2) DEFAULT NULL,
`wl` int(11) DEFAULT NULL,
`wldc` varchar(2) DEFAULT NULL,
`hx` int(11) DEFAULT NULL,
`hxdc` varchar(2) DEFAULT NULL,
`ls` int(11) DEFAULT NULL,
`lsdc` varchar(2) DEFAULT NULL,
`zz` int(11) DEFAULT NULL,
`zzdc` varchar(2) DEFAULT NULL,
`bx` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `sheet1` VALUES ('100646', '姓名1', '1', '260', '', '60', '', '61', '', '86', 'B', '96', 'A+', '政史');
INSERT INTO `sheet1` VALUES ('100902', '姓名2', '19', '220', '', '59', '', '89', '', '88', 'B', '95', 'A+', '政史');
INSERT INTO `sheet1` VALUES ('400023', '姓名3', '19', '220', '', '68', '', '69', '', '91', 'A', '91', 'A', '政史');
INSERT INTO `sheet1` VALUES ('100863', '姓名4', '1', '186', '', '90', '', '50', '', '79', 'C', '91', 'A', '政史');
INSERT INTO `sheet1` VALUES ('100830', '姓名5', '1', '262', '', '89', '', '78', '', '80', 'C', '88', 'A', '政史');
INSERT INTO `sheet1` VALUES ('100377', '姓名6', '19', '263', '', '89', '', '68', '', '80', 'C', '87', 'A', '政史');
INSERT INTO `sheet1` VALUES ('100639', '姓名7', '1', '256', '', '90', '', '98', '', '77', 'D', '86', 'B', '政史');
INSERT INTO `sheet1` VALUES ('101678', '姓名8', '1', '264', '', '88', '', '78', '', '88', 'B', '85', 'B', '政史');
INSERT INTO `sheet1` VALUES ('101805', '姓名9', '1', '253', '', '90', '', '87', '', '71', 'D', '85', 'B', '政史');
INSERT INTO `sheet1` VALUES ('101582', '姓名10', '1', '255', '', '42', '', '90', '', '81', 'B', '82', 'C', '政史');
INSERT INTO `sheet1` VALUES ('400031', '姓名11', '1', '186', '', '91', '', '30', '', '80', 'C', '79', 'C', '政史');
INSERT INTO `sheet1` VALUES ('101722', '姓名12', '3', '240', '', '104', 'A+', '77', 'A', '90', '', '50', '', '理化');
INSERT INTO `sheet1` VALUES ('100322', '姓名13', '21', '264', '', '66', 'D', '72', 'B', '60', '', '60', '', '理化');
INSERT INTO `sheet1` VALUES ('100898', '姓名14', '21', '256', '', '91', 'A', '70', 'B', '90', '', '91', '', '理化');
INSERT INTO `sheet1` VALUES ('100780', '姓名15', '3', '263', '', '91', 'A', '64', 'C', '88', '', '98', '', '理化');
INSERT INTO `sheet1` VALUES ('101682', '姓名16', '21', '249', '', '81', 'B', '64', 'C', '98', '', '71', '', '理化');
INSERT INTO `sheet1` VALUES ('100125', '姓名17', '3', '261', '', '86', 'A', '61', 'C', '60', '', '61', '', '理化');
INSERT INTO `sheet1` VALUES ('101784', '姓名18', '21', '256', '', '82', 'B', '60', 'C', '60', '', '62', '', '理化');
INSERT INTO `sheet1` VALUES ('101750', '姓名19', '3', '255', '', '83', 'A', '58', 'D', '67', '', '68', '', '理化');
INSERT INTO `sheet1` VALUES ('101609', '姓名20', '3', '261', '', '69', 'D', '57', 'D', '69', '', '91', '', '理化');
INSERT INTO `sheet1` VALUES ('100076', '姓名21', '21', '261', '', '70', 'B', '46', 'D', '55', '', '89', '', '理化');
排名要求:1、把学生总分(zf)依据理化与政史分开排名。2、在理化班中,wldc与hxdc必需达1B1C以上(注:不分是物理还是化学是哪个是B哪个是C)且ls和zz必需达60分以上才能排名,没有达到1B1C的接在1B1C之后再依zf由高到低进行排名;政史班也是如此,lsdc与zzdc必需达1B1C以上(注:不分是lsdc还是zzdc是哪个是B哪个是C)且wl和hx必需达60分以上才能排名,没有达到1B1C的接在1B1C之后再依zf由高到低进行排名。以上1和2两个条件要求同时达到。请问如何进行排名。谢谢
...全文
309 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xfy8xfy8 2012-10-17
  • 打赏
  • 举报
回复
谢谢mysdzlt2007,这只是排出了顺序,“学生名次”如何加上去呢?
mysdzlt2007 2012-10-16
  • 打赏
  • 举报
回复
试试看:
SELECT biaozhi,bx,wl,wldc,hx,hxdc,ls,lsdc,zz,zzdc,zf 
FROM (SELECT *,'3' AS groupid
FROM sheet1
WHERE bx='理化' AND ((wldc<='B+' AND hxdc<='C+') OR (wldc<='C+' AND hxdc<='B+')) AND ls>=60 AND zz>=60
UNION ALL
SELECT *,'4' AS groupid
FROM sheet1
WHERE bx='理化' AND (hxdc>='C+' OR wldc>='C+' OR ls<60 OR zz<60)
UNION ALL
SELECT *,'1' AS groupid
FROM sheet1
WHERE bx='政史' AND ((lsdc<='B+' AND zzdc<='C+') OR (lsdc<='C+' AND zzdc<='B+')) AND wl>=60 AND hx>=60
UNION ALL
SELECT *,'2' AS groupid
FROM sheet1
WHERE bx='政史' AND (lsdc>='C+' OR zzdc>='C+' OR wl<60 OR hx<60)) tmp
ORDER BY groupid,zf DESC,wldc,hxdc,lsdc,zzdc ;
xfy7xfy7 2012-10-15
  • 打赏
  • 举报
回复
结果是这样的:
+---------+------+-----+------+----+------+----+------+----+------+-----+------+
| biaozhi | bx | wl | wldc | hx | hxdc | ls | lsdc | zz | zzdc | zf | zzf |
+---------+------+-----+------+----+------+----+------+----+------+-----+------+
| 101678 | 政史 | 88 | | 78 | | 88 | B | 85 | B | 264 | 264 |
| 100377 | 政史 | 89 | | 68 | | 80 | C | 87 | A | 263 | 263 |
| 100830 | 政史 | 89 | | 78 | | 80 | C | 88 | A | 262 | 262 |
| 100646 | 政史 | 60 | | 61 | | 86 | B | 96 | A+ | 260 | 260 |
| 400023 | 政史 | 68 | | 69 | | 91 | A | 91 | A | 220 | 220 |
| 100639 | 政史 | 90 | | 98 | | 77 | D | 86 | B | 256 | -224 |
| 101582 | 政史 | 42 | | 90 | | 81 | B | 82 | C | 255 | -225 |
| 101805 | 政史 | 90 | | 87 | | 71 | D | 85 | B | 253 | -227 |
| 100902 | 政史 | 59 | | 89 | | 88 | B | 95 | A+ | 220 | -260 |
| 100863 | 政史 | 90 | | 50 | | 79 | C | 91 | A | 186 | -294 |
| 400031 | 政史 | 91 | | 30 | | 80 | C | 79 | C | 186 | -294 |
| 100780 | 理化 | 91 | A | 64 | C | 88 | | 98 | | 263 | 263 |
| 100125 | 理化 | 86 | A | 61 | C | 60 | | 61 | | 261 | 261 |
| 100898 | 理化 | 91 | A | 70 | B | 90 | | 91 | | 256 | 256 |
| 101682 | 理化 | 81 | B | 64 | C | 98 | | 71 | | 249 | 249 |
| 100322 | 理化 | 66 | D | 72 | B | 60 | | 60 | | 264 | -216 |
| 101609 | 理化 | 69 | D | 57 | D | 69 | | 91 | | 261 | -219 |
| 100076 | 理化 | 70 | B | 46 | D | 55 | | 89 | | 261 | -219 |
| 101784 | 理化 | 82 | B | 60 | C | 59 | | 62 | | 256 | -224 |
| 101750 | 理化 | 83 | A | 58 | D | 67 | | 68 | | 255 | -225 |
| 101722 | 理化 | 104 | A+ | 77 | A | 90 | | 50 | | 240 | -240 |
+---------+------+-----+------+----+------+----+------+----+------+-----+------+
21 rows in set
新手求助,谢谢
xfy7xfy7 2012-10-15
  • 打赏
  • 举报
回复
换一个想法,把不符合条件的zf变小,然后再排名。由于是新手,只做出让zf变小,但是不会让它再进行排名。
SELECT biaozhi,bx,wl,wldc,hx,hxdc,ls,lsdc,zz,zzdc,zf,
if((wl>=60 and hx>=60 and
bx='政史' and ((ls>=81 and zz>=80)or(ls>=78 and zz>=85)))or
(ls>=60 and zz>=60 and
bx='理化' and ((wl>=70 and hx>=60)or(wl>=70 and hx>=70))),zf,zf-480) zzf
FROM sheet1
ORDER BY bx,zzf desc;这一段话将会产生一个新表,把zf中不符合条件的变小。
排名用这样一段放:
SELECT biaozhi,zf,
(SELECT COUNT(zf) FROM sheet1 WHERE zf >a.zf)+1 mc
FROM sheet1 a
ORDER BY mc;
请问大侠们,如何把这两句话弄在一起呀。谢谢
xfy8xfy8 2012-10-14
  • 打赏
  • 举报
回复
xfy8xfy8 2012-10-14
  • 打赏
  • 举报
回复
版主:我用excel的形式,表述一下,还请您帮忙。本论坛不给上传附件,我在另一个论坛上传了一个附件。为了使数据更能说明问题,这个附件中的数据与本贴中的数据稍有一点不同,不影响排名要求。再次谢谢您。http://club.excelhome.net/forum.php?mod=attachment&aid=MTI2MjkxOXwzMGZkOTA4OXwxMzUwMTgyODU0fDE5NTU0OXw5MzExNjg%3D
xfy8xfy8 2012-10-14
  • 打赏
  • 举报
回复
顶一下,请版主帮忙呀。
xfy8xfy8 2012-10-13
  • 打赏
  • 举报
回复
不好意思,我是在excel中手工排的名,有点错。姓名17应为第3名,姓名16应为第4名。
也就是说:符合条件的按总分从高到低先排,不符合条件的按总分从高到低接着前面符合条件的学生后面再排。
政史班的数据有点巧,符合条件的都是高分,不符合条件的都是低分。但是理化班的数据中“姓名13”总分为264分在理化班中应排第一,但是由于wldc为D,所以就不是第一名,而是接在其它符合条件(wldc和hxdc达到1B1C以上且ls和zz的分数要大于等于60分)的学生后面排名。
xfy8xfy8 2012-10-13
  • 打赏
  • 举报
回复
上面有点乱:用如下形式吧(也就是省略右侧一部分)
biaozhi name zf MC bj
101678 姓名8 264 1 1
100377 姓名6 263 2 19
100830 姓名5 262 3 1
100646 姓名1 260 4 1
100639 姓名7 256 5 1
101582 姓名10 255 6 1
101805 姓名9 253 7 1
400023 姓名3 220 8 19
100902 姓名2 220 8 19
100863 姓名4 186 9 1
400031 姓名11 186 9 1
100898 姓名14 256 1 21
100780 姓名15 263 2 3
101682 姓名16 249 3 21
100125 姓名17 261 4 3
100322 姓名13 264 5 21
101609 姓名20 261 6 3
100076 姓名21 261 6 21
101784 姓名18 256 8 21
101750 姓名19 255 9 3
101722 姓名12 240 10 3
xfy8xfy8 2012-10-13
  • 打赏
  • 举报
回复
我用的是mysql5.5,想得到如下结果:
biaozhi name bj zf MC wl wldc hx hxdc ls lsdc zz zzdc bx
101678 姓名8 1 264 1 88 78 88 B 85 B 政史
100377 姓名6 19 263 2 89 68 80 C 87 A 政史
100830 姓名5 1 262 3 89 78 80 C 88 A 政史
100646 姓名1 1 260 4 60 61 86 B 96 A+ 政史
100639 姓名7 1 256 5 90 98 77 D 86 B 政史
101582 姓名10 1 255 6 42 90 81 B 82 C 政史
101805 姓名9 1 253 7 90 87 71 D 85 B 政史
400023 姓名3 19 220 8 68 69 91 A 91 A 政史
100902 姓名2 19 220 8 59 89 88 B 95 A+ 政史
100863 姓名4 1 186 9 90 50 79 C 91 A 政史
400031 姓名11 1 186 9 91 30 80 C 79 C 政史
100898 姓名14 21 256 1 91 A 70 B 90 91 理化
100780 姓名15 3 263 2 91 A 64 C 88 98 理化
101682 姓名16 21 249 3 81 B 64 C 98 71 理化
100125 姓名17 3 261 4 86 A 61 C 60 61 理化
100322 姓名13 21 264 5 66 D 72 B 60 60 理化
101609 姓名20 3 261 6 69 D 57 D 69 91 理化
100076 姓名21 21 261 6 70 B 46 D 55 89 理化
101784 姓名18 21 256 8 82 B 60 C 59 62 理化
101750 姓名19 3 255 9 83 A 58 D 67 68 理化
101722 姓名12 3 240 10 104 A+ 77 A 90 50 理化
ACMAIN_CHM 2012-10-13
  • 打赏
  • 举报
回复
按照你提供的测试数据,你认为正确的排名结果是什么样?


(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

xfy7xfy7 2012-10-13
  • 打赏
  • 举报
回复
请版主帮忙,这个问题与现在的江苏高考要求是一致的。大多数人都想了。

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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