[英]SQL: 'transpose' a number of bit/binary columns into one multivariate column
說我有以下數據:
name is_married has_dog wants_children
Tom 1 1 1
Dick 0 1 1
Harry 0 0 0
但我想產生以下數據:
name description
Tom is_married
Tom has_dog
Tom wants_children
Dick has_dog
Dick wants_children
即,我想將各種二進制字段中保存的信息放入一種形式,其中每個“二進制正數”都顯示在其自己的行中。
如果有成百上千的二進制列,有沒有辦法使它具有可伸縮性?
這是應該擴展的例程。
例:
DELIMITER $$
CREATE PROCEDURE myproc()
BEGIN
DECLARE sql_stmt varchar(200);
DECLARE exit_loop INTEGER DEFAULT 0;
DECLARE col_names CURSOR FOR SELECT CONCAT('select name, "', column_name, '" As Description from tbl where ' , column_name, '=1')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tbl'
and column_name <> 'Name'
ORDER BY ordinal_position;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE;
CREATE TEMPORARY TABLE temp (name varchar(200), description varchar(200));
OPEN col_names;
the_loop: LOOP
FETCH col_names
INTO sql_stmt;
IF exit_loop THEN
CLOSE col_names;
LEAVE the_loop;
END IF;
SET @s = CONCAT('INSERT INTO temp(name, description) ',sql_stmt);
PREPARE stmt1 FROM @s;
EXECUTE stmt1;
END LOOP the_loop;
SELECT * from temp ORDER BY name;
DROP TABLE temp;
END$$
DELIMITER ;
結果:
mysql> call myproc();
+------+----------------+
| name | description |
+------+----------------+
| Tom | ismarried |
| Tom | hasdog |
| Tom | wants_children |
| Dick | hasdog |
| Dick | wants_children |
+------+----------------+
5 rows in set (0.00 sec)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.