扒出多年前的關係型資料庫統計巔峰之作
需求點(資料為瞎造)需要獲取如下圖的複雜統計:
總人數 | 生日為空 | 18歲以下 | 18到29 | 30到39 | 40到49 | 50到59 | 60到69 | 70歲以上 | |
研究生 | 10 | 1 | 2 | 2 | 2 | 2 | 0 | 1 | 0 |
本科 | 100 | 10 | 20 | 0 | 20 | 20 | 5 | 0 | 5 |
大專 | 200 | 20 | 20 | 40 | - | - | - | - | - |
高中 | 50 | - | - | - | - | - | - | - | - |
未填學歷 | 30 | - | - | - | - | - | - | - | - |
表結構如下:
CREATE TABLE `sys_user` (
`id` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '編號',
`company_id` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '歸屬公司',
`office_id` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '歸屬部門',
`login_name` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '登入名',
`password` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '密碼',
`no` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '工號',
`name` varchar(100) COLLATE utf8_bin NOT NULL COMMENT '姓名',
`email` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '郵箱',
`volk` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '民族',
`entry_time` datetime DEFAULT NULL COMMENT '入司時間',
`phone` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '電話',
`mobile` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '手機',
`user_type` char(1) COLLATE utf8_bin DEFAULT '3' COMMENT '使用者型別',
`sex` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '性別',
`photo` varchar(1000) COLLATE utf8_bin DEFAULT NULL COMMENT '使用者頭像',
`birthday` datetime DEFAULT NULL COMMENT '出生日期',
`card` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '身份證號',
`degree` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '最高學歷',
`address` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '家庭住址',
`social_status` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '社保狀態',
`login_ip` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '最後登陸IP',
`login_date` datetime DEFAULT NULL COMMENT '最後登陸時間',
`login_flag` varchar(64) COLLATE utf8_bin DEFAULT '0' COMMENT '是否可登入',
`create_by` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '建立者',
`create_date` datetime NOT NULL COMMENT '建立時間',
`update_by` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '更新者',
`update_date` datetime NOT NULL COMMENT '更新時間',
`remarks` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '備註資訊',
`leave_time` datetime DEFAULT NULL COMMENT '離職時間',
`leave_flag` char(1) COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '減員標記',
`del_flag` char(1) COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '刪除標記',
PRIMARY KEY (`id`),
KEY `sys_user_office_id` (`office_id`),
KEY `sys_user_login_name` (`login_name`),
KEY `sys_user_company_id` (`company_id`),
KEY `sys_user_update_date` (`update_date`),
KEY `sys_user_del_flag` (`del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='使用者表';
統計sql如下(自己細品):
select
IFNULL((select label from sys_dict where type='user_education_type' AND VALUE = degree), '學歷沒錄入') deg,
SUM(CASE WHEN t.sex=1 THEN 1 ELSE 0 END) AS manAll,
SUM(CASE WHEN t.sex=2 THEN 1 ELSE 0 END) AS womanAll,
SUM(CASE WHEN t.sex=1 AND t.birthday is NULL THEN 1 ELSE 0 END) AS manNull,
SUM(CASE WHEN t.sex=2 AND t.birthday is NULL THEN 1 ELSE 0 END) AS womanNull,
SUM(CASE WHEN t.sex=1 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=18 THEN 1 ELSE 0 END) AS man18,
SUM(CASE WHEN t.sex=2 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=18 THEN 1 ELSE 0 END) AS woman18,
SUM(CASE WHEN t.sex=1 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=18 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=29 THEN 1 ELSE 0 END) AS man1829,
SUM(CASE WHEN t.sex=2 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=18 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=29 THEN 1 ELSE 0 END) AS woman1829,
SUM(CASE WHEN t.sex=1 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=30 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=39 THEN 1 ELSE 0 END) AS man3039,
SUM(CASE WHEN t.sex=2 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=30 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=39 THEN 1 ELSE 0 END) AS woman3039,
SUM(CASE WHEN t.sex=1 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=40 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=49 THEN 1 ELSE 0 END) AS man4049,
SUM(CASE WHEN t.sex=2 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=40 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=49 THEN 1 ELSE 0 END) AS woman4049,
SUM(CASE WHEN t.sex=1 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=50 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=59 THEN 1 ELSE 0 END) AS man5059,
SUM(CASE WHEN t.sex=2 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=50 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=59 THEN 1 ELSE 0 END) AS woman5059,
SUM(CASE WHEN t.sex=1 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=60 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=69 THEN 1 ELSE 0 END) AS man6069,
SUM(CASE WHEN t.sex=2 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=60 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) <=69 THEN 1 ELSE 0 END) AS woman6069,
SUM(CASE WHEN t.sex=1 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=70 THEN 1 ELSE 0 END) AS man70,
SUM(CASE WHEN t.sex=2 AND ROUND(DATEDIFF(CURDATE(), t.birthday)/365.2422) >=70 THEN 1 ELSE 0 END) AS woman70
from sys_user t
WHERE t.del_flag = 0 and t.leave_flag = 0
GROUP BY deg ORDER BY t.degree DESC;
總結
隨著使用者表的數量持續增大,直接呼叫sql執行時間會越來越長,建議使用定時執行結果入庫,每一個定時期一條結果,做到非實時,降低多次呼叫對資料庫的壓力。
相關文章
- 關係型資料庫和非關係型資料庫的區別資料庫
- 關係型資料庫與非關係型資料庫介紹!資料庫
- NoSQL:從關係型資料庫到非關係型資料庫SQL資料庫
- 關係型資料庫資料庫
- 關係型資料庫和非關係型資料庫的簡單對比資料庫
- 關係型資料庫的理解資料庫
- PostgreSQL關係型資料庫SQL資料庫
- 關係型資料庫概要資料庫
- 關係型資料庫原理資料庫
- 關係型資料庫,何以稱為“關係”資料庫
- OO資料庫和關係型資料庫資料庫
- 人臉識別的「巔峰」之作!甭管整成啥樣,3秒扒出你是誰
- 非關係型資料庫(NOSQL)和關係型資料庫(SQL)區別詳解資料庫SQL
- 關係型資料庫之SQL資料庫SQL
- 關係型資料庫之索引資料庫索引
- 關係型資料庫理論資料庫
- 非關係型資料庫:Cassandra資料庫
- redis—非關係型資料庫Redis資料庫
- 寫給開發者看的關係型資料庫設計資料庫
- SQL與NoSQL(關係型與非關係型)資料庫的區別SQL資料庫
- 目前主流的兩類關係型資料庫系統(轉)資料庫
- 資料庫入門之3張表對比關係型與非關係型資料庫資料庫
- 關係型資料庫和非關係型資料庫介紹及優劣勢比較資料庫
- 列舉常見的關係型資料庫和非關係型都有那些?資料庫
- NoSQL資料庫探討 -- 非關係型資料庫SQL資料庫
- SQLALchemy操作MySQL關係型資料庫MySql資料庫
- mysqlclient操作MySQL關係型資料庫MySqlclient資料庫
- FastAPI(44)- 操作關係型資料庫ASTAPI資料庫
- Node MySQL打造關係型資料庫MySql資料庫
- 關係型資料庫設計三大正規化資料庫
- MapReduce 與 關係型資料庫的區別資料庫
- 關係型資料庫表結構的兩個設計技巧資料庫
- 資料庫——關係型資料庫MySQL--簡單使用資料庫MySql
- 平時常見關係型資料庫資料庫
- 聊聊非關係型資料庫MongoDB索引資料庫MongoDB索引
- 反DDD模式之關係型資料庫模式資料庫
- 設計資料庫關係模型資料庫模型
- OLAP MPP分散式關係型資料庫的雙活容災系統的設計分散式資料庫