【发布时间】:2017-09-16 15:30:22
【问题描述】:
我查看了Mysql query to dynamically convert rows to columns 的答案,但我无法让它发挥作用,因为我需要加入表格以获取所有信息。你能帮我把“问题”作为列名,如此处所示吗?
datestamp pay benefits ... career advancement
---------------------------------------------------------------------
2/16/2017 11:55 Somewhat Slightyly Slightly
2/16/2017 11:55 Agree Somewhat Very
数据如下:
id datestamp survey_col value
-----------------------------------------------
1 2/16/2017 11:55 885457X234X1368SQ001 A3
1 2/16/2017 11:55 885457X234X1368SQ002 A4
1 2/16/2017 11:55 885457X234X1368SQ003 A4
1 2/16/2017 11:55 885457X234X1368SQ004 A3
1 2/16/2017 11:55 885457X234X1368SQ005 A2
1 2/16/2017 11:55 885457X234X1368SQ006 A3
1 2/16/2017 11:55 885457X234X1368SQ007 A4
1 2/16/2017 11:55 885457X234X1368SQ008 A3
1 2/16/2017 11:55 885457X234X1368SQ009 A4
1 2/16/2017 11:55 885457X234X1368SQ010 A1
我正在使用此代码:
SELECT T.id, T.datestamp, SQ.question,
IF(type IN ("K", "N", "S", "T", "Y", "*") AND type NOT IN ("F"),
T.value,
IF(parent_qid = 0, SA.answer, SA2.answer)
) as answer
FROM survey_questions SQ
JOIN survey_lookup SL ON SL.qid = SQ.qid
JOIN tmp T ON T.survey_col = SL.survey_col
LEFT JOIN survey_answers SA ON SA.qid = SQ.qid
AND SA.code = T.value
AND SA.language = 'en'
LEFT JOIN survey_answers SA2 on SA2.qid = SQ.parent_qid
AND SA2.code = T.value
AND SA2.language = 'en'
WHERE SQ.language = 'en'
;
提供:
id datestamp question answer
----------------------------------------------------------------
1 2/16/2017 11:55 Pay Somewhat
1 2/16/2017 11:55 Benefits (health plan, leave, etc.) Slightly
1 2/16/2017 11:55 Career Advancement Slightly
1 2/16/2017 11:55 Access to Training Somewhat
1 2/16/2017 11:55 Leadership Style Very
1 2/16/2017 11:55 Manager/Supervisor Style Somewhat
1 2/16/2017 11:55 Please enter comments The company's policies...
当所有数据都在一个表中并且我不必使用连接时,此代码有效。
SET @sql = NULL;
SET SESSION GROUP_CONCAT_MAX_LEN = 1000000; -- default is 1024
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(question = ''', REPLACE(question,"'", "\\'"), ''', answer, NULL)) AS ''', REPLACE(question,"'", "\\'"), ''''
)
) INTO @sql
FROM tmp;
SET @sql = CONCAT('SELECT row_id, submitdate, ', @sql, ' FROM ', survey_report, ' GROUP BY row_id');
IF DEBUG = 1 THEN
SELECT @sql;
END IF;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
这是不使用 REPLACE 功能(我想使用)的尝试。
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(SQ.question = ', '''SQ.question''','
IF(type IN ("K", "N", "S", "T", "Y", "*") AND type NOT IN ("F"),
T.value,
IF(parent_qid = 0, SA.answer, SA2.answer)
) as answer, NULL)) as answer', '''SQ.question''')
) INTO @sql
FROM survey_questions SQ
JOIN survey_lookup SL ON SL.qid = SQ.qid
JOIN tmp T ON T.survey_col = SL.survey_col
LEFT JOIN survey_answers SA ON SA.qid = SQ.qid
AND SA.code = T.value
AND SA.language = 'en'
LEFT JOIN survey_answers SA2 on SA2.qid = SQ.parent_qid
AND SA2.code = T.value
AND SA2.language = 'en'
WHERE SQ.language = 'en';
SET @sql = CONCAT('SELECT id, datestamp, ', @sql, ' FROM tmp GROUP BY id');
SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
【问题讨论】:
-
您可能已经知道这称为透视表。您已经发现 MySQL 是多么让人头疼。
-
我同意。我正在使用非常具有挑战性的软件来获取所需的数据。我使用游标来获取非常慢的数据,但我发现联合使它更快。因此,我使用联合来获取数据,以便创建连接。现在,我正在尝试将其转换为可以在绘图软件中使用的格式。我尝试了几件事,这似乎是最好的,因为它在 11 秒内运行,而其他解决方案我花了 4 分钟。
-
这是 SQL 是解决问题的错误解决方案的其中一种情况。编写 PHP/Java/任何代码来进行格式化。使用 SQL 提供数据。
-
谢谢詹姆斯。我正在使用 JBoss Dashbuilder,我认为它是用 java 编写的,所以这是一个选项。不幸的是,我不熟悉java。我可以将数据保存到另一个表中,然后对其进行格式化,但我认为写入磁盘很慢。
标签: mysql dynamic pivot-table dynamic-columns