Re: [SQL ] 多重欄位值序列或組合的複合搜尋
※ 引述《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
討論串 (同標題文章)