您可以使用MySQL創建MySQL程序,將解決這個問題:
USE test;
/*Create long input table 'test' with variables of varying length*/
DROP TABLE nums;
CREATE TABLE nums (id INT(2));
INSERT INTO nums
VALUES
(0), (1), (2), (3), (4), (5), (6), (7);
DROP TABLE test;
CREATE TABLE test (id INT(2), var VARCHAR(5), attribute VARCHAR(6), PRIMARY KEY (id, var));
INSERT INTO test
SELECT nums3.*, REPEAT(CHAR(97+RAND()*24),CAST(6.*RAND() AS INT)) AS attribute
FROM (SELECT DISTINCT nums2.id1 as id, CONCAT('var', LPAD(CAST(16.*RAND() AS INT),2,'0')) AS var
FROM (SELECT DISTINCT nums.id as id1, nums1.id as id2 FROM nums, nums as nums1) AS nums2) AS nums3;
/*Create SQL program to convert long to wide format (R: reshape)*/
SELECT DISTINCT CONCAT('DROP TABLE result;\nCREATE TABLE result (id INT(2),
', GROUP_CONCAT(CONCAT(field) SEPARATOR ', '), ');')
FROM
(SELECT DISTINCT CONCAT(var, CONCAT(' VARCHAR(', max(length(attribute)), ')')) AS field
FROM test GROUP BY var) AS fields
UNION
SELECT CONCAT("INSERT INTO result \nSELECT DISTINCT test.id, ", GROUP_CONCAT(var SEPARATOR '.attribute, '),
".attribute FROM (SELECT DISTINCT id FROM test) AS test")
FROM (SELECT DISTINCT var FROM test ORDER BY var) as vars
UNION
SELECT CONCAT("LEFT JOIN test AS ", var, " ON test.id = ", var, ".id AND ", var, ".var=", '"', var, '"')
FROM (SELECT DISTINCT var FROM test ORDER BY var) as vars
UNION
SELECT ";" ;
/*Copy output to screen editor, delete '|' symbols and superfluous white spaces.
Then copy to MySQL prompt, run by pressing 'enter' key and view 'result'*/
'我想重組使用MySQL數據在這樣的新表中:'---這是一個非常糟糕的主意。這樣做的最初原因是什麼? – zerkms 2012-03-02 03:15:21
我不認爲在MySQL中這很容易 - 如果你已經在使用R,我建議在R中進行重塑。你可以試試['sqldf'](http://code.google.com/p/sqldf /)包來對數據幀執行類似於SQL的查詢。 – 2012-03-02 03:17:23
做這種事情有很多原因。就我而言,我需要收集有關個人的信息(nestedid)並彙總家庭級別(級別2)的信息。不過,我不只是想要一堆交叉標籤,因爲nestedids之間的特定關係非常重要。 – SMM 2012-03-02 03:31:32