MySQL動態(tài)列轉(zhuǎn)行的實現(xiàn)示例
介紹??
在實際的數(shù)據(jù)庫查詢中,有時候我們需要將表中的動態(tài)列(即列數(shù)不固定)轉(zhuǎn)換為行,以便更好地進行數(shù)據(jù)分析和展示。在MySQL中,可以通過使用一些技巧和函數(shù)來實現(xiàn)動態(tài)列轉(zhuǎn)行的功能。本文將介紹怎么實現(xiàn)MySQL動態(tài)列轉(zhuǎn)行。
初始表
首先,假設(shè)我們有一個表格 users,其中需要動態(tài)的列 create_time,我們希望將該列轉(zhuǎn)換為行。下面是一個示例表格的結(jié)構(gòu):
# 創(chuàng)建用戶表 DROP TABLE IF EXISTS users; CREATE TABLE users ( id INT PRIMARY KEY auto_increment COMMENT '主鍵', username VARCHAR(30) NOT NULL COMMENT '用戶名', password VARCHAR(30) NOT NULL COMMENT '密碼', nickname VARCHAR(30) COMMENT '昵稱', phone VARCHAR(11) COMMENT '電話號碼', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間', update_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間', is_deleted INT DEFAULT 0 COMMENT '邏輯刪除(1:已刪除,0:未刪除)' ) COMMENT '用戶信息表'; # 插入數(shù)據(jù) INSERT INTO users (username, password, nickname, phone, create_time) VALUES ('admin', 'admin', '張三', '18955554444', '2023-05-01 22:48:11'), ('root', 'root', '李四', '17755624235', '2023-05-02 22:48:11'), ('lisi', 'lisi', '王五', '15989654123', '2023-05-03 22:48:11'), ('lucky', 'lucky', '趙六', '19956852548', '2023-05-04 22:48:11'), ('admin2', 'admin', '張三', '18955554444', '2023-05-01 22:48:11'), ('root2', 'root', '李四', '17755624235', '2023-05-02 22:48:11'), ('lisi2', 'lisi', '王五', '15989654123', '2023-05-01 22:48:11'), ('lucky2', 'lucky', '趙六', '19956852548', '2023-05-01 22:48:11');
想要的效果:
通過 格式化日期+計數(shù)函數(shù)+分組 實現(xiàn)
select DATE_FORMAT(create_time,'%Y/%m/%d') as create_date, count(*) as sum from users group by create_date
執(zhí)行結(jié)果:
顯然這并不是我們想要的效果。 這時候就需要用到動態(tài)列轉(zhuǎn)行了。
通過 格式日期+求和函數(shù) 實現(xiàn)
SELECT SUM( DATE_FORMAT( create_time, '%Y/%m/%d' ) = '2023/05/01' ) AS '2023/05/01', SUM( DATE_FORMAT( create_time, '%Y/%m/%d' ) = '2023/05/02' ) AS '2023/05/02', SUM( DATE_FORMAT( create_time, '%Y/%m/%d' ) = '2023/05/03' ) AS '2023/05/03', SUM( DATE_FORMAT( create_time, '%Y/%m/%d' ) = '2023/05/04' ) AS '2023/05/04' FROM users
執(zhí)行結(jié)果:
這樣就達到我們要的效果了。但是有局限性,如果在加一個日期就需要改SQL。
通過 存儲過程+分組合并函數(shù)+SQL拼接 實現(xiàn)
# 設(shè)置結(jié)束分隔符 DELIMITER $$ # 判斷定義的存儲過程是否存在,存在刪除,以防存儲過程存在報錯 DROP PROCEDURE IF EXISTS pro$$ # 創(chuàng)建存儲過程 CREATE PROCEDURE pro () BEGIN # 定義一個變量 SET @SQL = NULL; # 把查詢的日期賦給變量 # 這里需要將日期格式化一下, 我要的格式是yyyy/MM/dd, # 而數(shù)據(jù)給我們的是yyyy-MM-dd HH:mm:ss SELECT GROUP_CONCAT( DISTINCT CONCAT( 'SUM(DATE_FORMAT(create_time, \'%Y/%m/%d\') = ''', DATE_FORMAT( create_time, '%Y/%m/%d' ), ''') AS ''', DATE_FORMAT( create_time, '%Y/%m/%d' ), '''' ) ) INTO @SQL FROM users; # 注意:如果運行時報錯可以執(zhí)行 # SELECT @SQL; # 檢查拼接的SQL是否正確 # 拼接sql SET @SQL = concat( 'select ', @SQL, ' from users' ); # 預(yù)處理語句 PREPARE stmt FROM @SQL; # 執(zhí)行 EXECUTE stmt; # 銷毀 DEALLOCATE PREPARE stmt; # 結(jié)束 END $$ # 調(diào)用存儲過程 CALL pro ();
為了方便測試在插入一筆數(shù)據(jù)
INSERT INTO users (username, password, nickname, phone, create_time) VALUES ('test', 'test', 'test', '18955554844', '2023-05-08 22:48:11');
執(zhí)行結(jié)果:
通過動態(tài)的SQL拼接這種方法可以幫助我們更好地處理動態(tài)列的數(shù)據(jù),方便進行后續(xù)的數(shù)據(jù)分析和展示。這樣就滿足我們的場景了。
到此這篇關(guān)于MySQL動態(tài)列轉(zhuǎn)行的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)MySQL動態(tài)列轉(zhuǎn)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL導(dǎo)出數(shù)據(jù)遇到secure-file-priv問題的解決方法
這篇文章主要為大家詳細介紹了MySQL導(dǎo)出數(shù)據(jù)遇到secure-file-priv問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10MySQL數(shù)據(jù)庫下用戶及用戶權(quán)限配置
這篇文章主要介紹了MySQL數(shù)據(jù)庫下用戶及用戶權(quán)限配置的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-08-08MySQL中日期和時間戳互相轉(zhuǎn)換的函數(shù)和方法
這篇文章主要介紹了MySQL中日期和時間戳互相轉(zhuǎn)換的函數(shù)和方法,本文分別講解了時間戳轉(zhuǎn)換成日期的方法和把日期轉(zhuǎn)換為時間戳的方法,需要的朋友可以參考下2015-06-06