免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gqywf
打印 上一主题 下一主题

[SQL GROUP BY]一个经典的SQL问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-03-07 08:59 |只看该作者
(
SELECT class, count( mark ) , count( fen )
FROM DATA WHERE mark >60
GROUP BY class
)
UNION (

SELECT class, count( mark ) , count( fen )
FROM DATA WHERE fen =70
GROUP BY class
)

弄了好几天,上边的语句终于可以运行,
不过结果是两个语句insert起来的样子,
我想要的是两个语句jion起来的样子,有办法吗?

楼上的结果只有2行记录,不行。

[ 本帖最后由 gqywf 于 2006-3-7 13:40 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2006-03-07 10:33 |只看该作者
原帖由 gqywf 于 2006-3-7 08:59 发表
(
SELECT student, count( mark ) , count( fen )
FROM DATA WHERE mark >60
GROUP BY class
)
UNION (

SELECT student, count( mark ) , count( fen )
FROM DATA WHERE fen =70
GROUP BY class
...


没看清,照你的要求,在classID上进行分组就行了,具体的WHEN条件,可以自己组合

  1. SELECT COUNT(*),CASE WHEN Mark>60 THEN 1 WHEN fen>70 THEN 2 ELSE 3 END as gid,classID FROM ttt GROUP BY classID;
复制代码

论坛徽章:
0
13 [报告]
发表于 2006-03-07 13:51 |只看该作者
我明白了,原来的问题没说明白,应该是类似这样:
SELECT
class, count( mark ) as mmm , count( fen ) as fff
FROM DATA
WHERE (??
GROUP BY class
条件是mark>60 的合计为mmm,fen>70的合计为fff
mark 和 fen 单独合计,互不影响,但我不知道应该怎样写。

[ 本帖最后由 gqywf 于 2006-3-7 13:57 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2006-03-07 13:56 |只看该作者
我这几天都快被搞晕了,本来用循环可以搞定,但是有几万个学生,几百个班级

运行太慢,受不了。

论坛徽章:
0
15 [报告]
发表于 2006-03-07 14:33 |只看该作者
classid mark fen
1          61    60
1          50    71
1          70    68

你要的效果是不是
classid mark fen
1          2      1

论坛徽章:
0
16 [报告]
发表于 2006-03-07 14:55 |只看该作者
对啊,应该怎么弄啊。

论坛徽章:
0
17 [报告]
发表于 2006-03-07 15:01 |只看该作者
select classid, count(case when mark > 60 then 1 end) as m, count(case when fen > 70 then 1 end) as f from tbname group by classid
受 Namelessxp 启发而写,我老是不记得去用 case when,一直习惯用我的那种方法来合成结果。

论坛徽章:
0
18 [报告]
发表于 2006-03-07 15:20 |只看该作者
谢谢了,我去试试先。。。

论坛徽章:
0
19 [报告]
发表于 2006-03-07 15:23 |只看该作者
太好了,终于搞定,高兴ing。。。。。。。。。。。

论坛徽章:
0
20 [报告]
发表于 2006-03-07 15:26 |只看该作者
原帖由 rardge 于 2006-3-7 15:01 发表
select classid, count(case when mark > 60 then 1 end) as m, count(case when fen > 70 then 1 end) as f from tbname group by classid
受 Namelessxp 启发而写,我老是不记得去用 case when,一直习惯 ...


结果正确
附上我的验证用的,不知道为啥,不爱在count里面用case when,下面是跟PHP数组结合做的

  1. $dbhost = 'localhost';
  2. $dbuser = 'root';
  3. $dbpass = '';
  4. $dbused = 'test';
  5. $tbname = 'ttt';

  6. $sql = "SELECT COUNT(*) as num,CASE WHEN Mark>60 AND fen>70 THEN 1 WHEN fen>70 THEN 2 WHEN Mark>60 THEN 3 ELSE 4 END as gid,classID FROM $tbname GROUP BY classID,gid";
  7. $dh = mysql_connect($dbhost,$dbuser,$dbpass) or die("Connect fail");
  8. mysql_select_db('test',$dh) or die("Select DB fail");
  9. $query = mysql_query($sql) or die("Query fail");
  10. while ($row = mysql_fetch_array($query)){
  11.         $result[$row['classID']][$row['gid']] = $row['num'];
  12. }
  13. mysql_close($dh);
  14. echo '<plaintext>';
  15. var_dump($result);
  16. if (is_array($result)){
  17.         foreach ($result as $key => $val){
  18.                 echo "班级:$key \n";
  19.                 echo "fen:".($val[1]+$val[2]+0);
  20.                 echo " Mark:".($val[1]+$val[3]+0);
  21.                 echo " Other:".($val[4]+0)."\n";
  22.         }
  23. }
  24. exit;
复制代码

  1. CREATE TABLE `ttt` (
  2.   `StudentID` int(10) default NULL,
  3.   `ClassID` int(10) default NULL,
  4.   `Mark` int(10) default NULL,
  5.   `fen` int(10) default NULL
  6. ) TYPE=MyISAM
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP