count 多个字段_一句话实现字段拆分成多行
把表中某字段根據分隔符拆分成N個字符串后,再用這N個字符串把這一行演變成N行。
用SQL來解決這個問題非常煩瑣!
SQL里沒有提供集合對象,不能提供根據拆分后的字符串集合把一行變成多行的操作。解決這個問題的思路就是先求出字段拆分后的最大字符串個數M,然后構造一個M行1列的臨時表T2,其列名為lv,則各行lv值分別為1,2,……,M,然后用原表與之叉乘,叉乘時取字段拆分后的第http://T2.lv個字符串。這樣寫出來的SQL是多個子查詢嵌套而成,其語法是比較復雜的。而且各種數據庫中拆分字符串的函數并不統一,所以SQL的寫法也各不相同。
舉個例子:現有學生選修課數據表COURSES數據如下,要求查出每個學生選修了幾門課:
要求輸出結果如下:
以Oracle為例,用SQL寫出來是這樣:
SELECT STUDENT, COUNT(*) NUM FROM
(SELECT T1.COURSE, REGEXP_SUBSTR(T1.STUDENTS, '[^,]+', 1, http://T2.LV ) STUDENT
FROM COURSES T1,
( SELECT LEVEL LV
FROM (SELECT MAX(REGEXP_COUNT(A.STUDENTS, '[^,]+', 1)) R_COUNT
FROM COURSES A
) B
CONNECT BY LEVEL <= B.R_COUNT) T2
WHERE REGEXP_SUBSTR(T1.STUDENTS, '[^,]+', 1, http://T2.LV) IS NOT NULL
) C
GROUP BY STUDENT
ORDER BY NUM DESC;
這里的C就是前文提到的那個臨時表,可見這個SQL層次很多,可讀性比較差,不易讀懂。
如果用集算器的SPL語言來解決這個問題,就會簡單很多,只需1行代碼:
connect("mydb").query("SELECT * FROM COURSES").news(STUDENTS.split@c();~:STUDENT).groups(STUDENT;count(1):NUM).sort(-NUM)
SPL語言有集合對象,并提供了根據集合把一行擴展成多行的功能,所以寫起來思路清晰明了,簡便易懂,并且語法統一,不論數據來自哪種數據庫還是來自文件型數據源,寫法都是一樣的。
SPL 集合還提供了交、差、并運算,聚合運算,循環遍歷運算,請閱《SPL教案 集合》
SPL也能很方便地嵌入到JAVA應用,可參考《Java 如何調用 SPL 腳本》。
具體使用方法可參考 《如何使用集算器》。
總結
以上是生活随笔為你收集整理的count 多个字段_一句话实现字段拆分成多行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python异常包_python异常处理
- 下一篇: 4j是合法python数字类型_pyth