作者ThreeDay0905 (三天)
看板Database
标题Re: [SQL ] 多重栏位值序列或组合的复合搜寻
时间Fri Sep 24 14:35:20 2010
※ 引述《danny0838 (道可道非常道)》之铭言:
: 举例来说,资料结构如下:
: 学生ID 志愿序 志愿大学 志愿科系
: ------------------------------------
: 1 1 台大 医学系
: 1 2 台大 电机系
: 1 3 台大 法律系
: 1 4 阳明 医学系
: ...
: 1 10 长庚 医学系
: 2 1 台大 数学系
: 2 2 ... ...
: ...
: 现在要下 SQL 指令去找:
: 1.所有符合志愿大学含有(包括以上)2个台大,1个阳明,1个长庚的学生
比较简单做法是先把学生ID跟志愿大学做GROUP
接着筛选出 COUNT(志愿科系) > 条件的资料
接着在做判断,比较笨的做法就是把这些筛选出来的资料
把三个都符合的学生资料捞出来
SQL语法像是
===========================================================
SELECT * FROM
(
SELECT 学生ID FROM 资料表 GROUP BY 学生ID, 志愿大学
HAVING (志愿大学 = '台大' AND COUNT(志愿科系) >= 2) or
(志愿大学 = '阳明' AND COUNT(志愿科系) >= 1) or
(志愿大学 = '长庚' AND COUNT(志愿科系) >= 1)
) as tempTb
GROUP BY tempTb.学生ID HAVING COUNT(学生ID) >= 3
============================================================
假如是MSSQL的话用PIVOT可以比较直觉
SELECT * FROM (SELECT 学生ID, 志愿大学, 志愿科系 FROM 资料表 ) as sourceTb
PIVOT( COUNT(志愿科系) FOR 志愿大学 IN ([台大], [阳明], [长庚]) )tempTb
WHERE 台大 >= 2 AND 长庚 >=1 AND 阳明 >= 1
============================================================
应该有更好的做法,这两个做法都是BY CASE去做
扩充性跟弹性都不足
仅止於参考
: 2.所有符合志愿大学按志愿序排列含有 台大-台大-长庚-阳明 的学生
: 允许跳号,比如以下这位 X 学生符合:
: 学生ID 志愿序 志愿大学 志愿科系
: ------------------------------------
: X 1 台大 XXX
: X 2 北医 XXX
: X 3 清大 XXX
: X 4 台大 XXX
: X 5 交大 XXX
: X 6 辅仁 XXX
: X 7 长庚 XXX
: X 8 成大 XXX
: X 9 阳明 XXX
: 请教各位大大怎麽下 SQL 指令?
: PS:schema 未定,以上只是初步的蓝图,有必要可以改。
: PS2:我是使用 MySQL
这个CASE必须表示必须要考虑到顺序 ?
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.169.184.107