MySQL中的縱表轉橫表是常見的需求,它可以將多個表中的行轉化為列,這樣可以更加方便的進行數據的分析和處理。我們可以使用MySQL的自定義函數來實現這個轉化過程。
下面我們來看一下具體的實現方法,我們需要自定義兩個函數:一個用來獲取列名,另一個用來生成動態的SQL語句。具體代碼如下:
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 ;
以上是用來創建函數的代碼,在使用時可以進行簡單的封裝。例如下面的代碼可以將多張表轉化為橫表:
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 ;
以上封裝了縱表轉橫表需要用到的函數,有了這些函數,我們就可以更加方便的對數據進行處理了。