SQL 如何查詢每個分組都出現的欄位值
資料分組以後,要找出在每個分組中都出現的某個欄位值。
用SQL來解決這個問題並不容易!
SQL缺少單純的分組操作,只能返回各分組的統計值,而不能對各組的成員再進行更細的交、差、並等集合運算。要解決這種問題就需要多層巢狀子查詢來變相地實現。
舉個例子:查詢每週都加班的員工以進行表彰。現有加班資料表OVERTIME_WORK資料如下:
WORKDATE | NAME |
2019-07-01 | Tom |
2019-07-02 | John |
2019-07-03 | Tom |
2019-07-04 | Cart |
2019-07-08 | Tom |
2019-07-09 | Jordan |
2019-07-10 | Kate |
2019-07-10 | John |
2019-07-15 | Leon |
2019-07-16 | John |
2019-07-17 | Tom |
2019-07-18 | John |
2019-07-22 | Jim |
2019-07-23 | Tom |
2019-07-24 | John |
2019-07-25 | Cart |
… | … |
以Oracle為例,用SQL寫出來是這樣:
WITH A AS
(SELECT COUNT(*) NUM FROM
(SELECT DISTINCT TO_CHAR(WORKDATE,'IW') FROM OVERTIME_WORK )
),
B AS
(SELECT TO_CHAR(WORKDATE,'IW') W, NAME
FROM OVERTIME_WORK
GROUP BY TO_CHAR(WORKDATE,'IW'), NAME
),
C AS
(SELECT NAME, COUNT(*) NUM FROM B GROUP BY NAME )
SELECT NAME FROM C WHERE NUM=(SELECT NUM FROM A);
這裡的A查出共有幾周,B查出每週加班的不同員工,C查出B裡各員工的出現次數,最後從C裡選出出現次數與總週數相等的員工。解決思路比較繞,這種SQL既難寫又難懂。
集算器的SPL語言支援集合運算,解決這個問題就會簡單很多,計算出每週加班員工的交集即可,只需1行程式碼:
connect("mydb").query("SELECT * FROM OVERTIME_WORK").group((WORKDATE-date("2019-07-01"))\7).(~.(NAME)).isect()
【問題延伸】
* 查詢每週至少加班兩次的員工
* 查詢每個月消費金額均排在前20名的客戶名稱
SPL 擅長解決這類分組子集和組內有序計算,請閱 、 、 、
集算器 SPL 是解決 SQL 難題的專業指令碼語言,它語法簡單,符合自然思維,是天然分步、層次清晰的程式導向計算語言。它採用與資料庫無關的統一語法,編寫的演算法可在資料庫間無縫遷移。它是桌面級計算工具,即裝即用,配置簡單,除錯功能完善,可設定斷點、單步執行,每步執行結果都可檢視。請參閱
SPL也能很方便地嵌入到JAVA應用,可參考 。
具體使用方法可參考 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2699098/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Laravel 一條 SQL 如何 count 多個欄位,Laravel 一條 sql 查詢每個分類的數量LaravelSQL
- SQL 如何計算每個分組的中位數SQL
- 查詢某個欄位的不同值
- MySQL如何查詢某個欄位含有字母數字的值MySql
- SQL查詢列(欄位)重複值及操作--整理SQL
- mysql sql同一個欄位多個行轉成一個欄位查詢MySql
- 查詢oracle欄位預設值Oracle
- MySQL查詢某個欄位含有字母數字的值MySql
- mysql基礎 依據一個欄位查詢另外一個欄位存在不同的值MySql
- 多個值以,分隔儲存在一個欄位精確匹配查詢 sql語句SQL
- sql server分組查詢示例SQLServer
- 在 with 查詢中只查詢個別欄位
- MySQL GROUP BY分組取欄位最大值MySql
- sql根據多個欄位查詢重複記錄SQL
- 如何在Clob欄位中查詢
- sql分組查詢語句--行內分組(非聚合分組)SQL
- MySQL資料庫查詢多個欄位值全部相同的記錄MySql資料庫
- Django框架:8、聚合查詢、分組查詢、F與Q查詢、ORM查詢最佳化、ORM事務操作、ORM常用欄位型別、ORM常用欄位引數Django框架ORM型別
- SQL Server 查詢表註釋和欄位SQLServer
- SQL Server 2008 中SQL查詢語句中欄位值不區分大小寫問題處理SQLServer
- Oracle總結【SQL細節、多表查詢、分組查詢、分頁】OracleSQL
- clob 欄位查詢
- Laravel ORM 中,根據關聯查詢的欄位值,對主查詢排名LaravelORM
- [Mysql 查詢語句]——查詢欄位MySql
- SQL“多欄位模糊匹配關鍵字查詢”SQL
- oracle分組查詢獲得組的最大值記錄Oracle
- mongodb查詢資料庫中某個欄位中的值包含某個字串的方法MongoDB資料庫字串
- sqlserver查詢一個庫所有表的欄位名及欄位型別SQLServer型別
- 分組查詢
- SQL 兩個表組合查詢SQL
- SQL2005查詢表中欄位的描述SQL
- 如何查詢某個資料表中除某個欄位的所有資訊???
- Sql查詢 一個表中某欄位的資料在另一個表中某欄位中不存在的SQL
- 揭秘PostgreSQL:如何查詢表欄位名稱SQL
- 查詢/刪除重複的資料(單個欄位和多個欄位條件)
- Native for sql 查詢列欄位非命令列形式SQL命令列
- SqlServer根據特定欄位分組後,對需要欄位進行分組拼接SQLServer
- 查詢外來鍵約束、子表欄位等資訊的SQLSQL