MySQL中的縱表轉(zhuǎn)橫表是常見的需求,它可以將多個(gè)表中的行轉(zhuǎn)化為列,這樣可以更加方便的進(jìn)行數(shù)據(jù)的分析和處理。我們可以使用MySQL的自定義函數(shù)來實(shí)現(xiàn)這個(gè)轉(zhuǎn)化過程。
下面我們來看一下具體的實(shí)現(xiàn)方法,我們需要自定義兩個(gè)函數(shù):一個(gè)用來獲取列名,另一個(gè)用來生成動(dòng)態(tài)的SQL語(yǔ)句。具體代碼如下:
DELIMITER $$ CREATE FUNCTION `get_row_names`(table_name VARCHAR(100)) RETURNS TEXT DETERMINISTIC BEGIN DECLARE sql_string TEXT; SET sql_string = ''; SELECT GROUP_CONCAT(DISTINCT CONCAT('`',column_name,'`')) INTO sql_string FROM information_schema.columns WHERE table_name = table_name AND table_schema = DATABASE(); RETURN sql_string; END$$ DELIMITER ; DELIMITER $$ CREATE FUNCTION `vertical_to_horizontal`(table_list TEXT) RETURNS TEXT BEGIN DECLARE sql_string TEXT; SET sql_string = CONCAT("SELECT ", get_row_names(table_list), " FROM ", table_list, " GROUP BY ", get_row_names(table_list)); RETURN sql_string; END$$ DELIMITER ;
以上是用來創(chuàng)建函數(shù)的代碼,在使用時(shí)可以進(jìn)行簡(jiǎn)單的封裝。例如下面的代碼可以將多張表轉(zhuǎn)化為橫表:
DELIMITER $$ CREATE PROCEDURE `trans_data_table` (in_table_list TEXT, out_table_name VARCHAR(100)) BEGIN DECLARE sql_string TEXT; SET sql_string = CONCAT('CREATE TABLE IF NOT EXISTS ', out_table_name , ' AS ', vertical_to_horizontal(in_table_list)); PREPARE stmt FROM sql_string; EXECUTE stmt; DEALLOCATE PREPARE stmt; END$$ DELIMITER ;
以上封裝了縱表轉(zhuǎn)橫表需要用到的函數(shù),有了這些函數(shù),我們就可以更加方便的對(duì)數(shù)據(jù)進(jìn)行處理了。