欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

mysql 縱表轉(zhuǎn)橫表函數(shù)

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)行處理了。