我写了一个查询,根据条件将几行转换为列。
然而,有些情况下没有行满足条件,但我希望返回一些结果。
下面是表格的示例和我要寻找的结果。
源表:
id | respondent_id | 人口统计 | 问题 | 回答 |
---|---|---|---|---|
1 | 1 | 已检查 | 年龄 | 30 |
2 | 1 | 空 | 教育 | 硕士 |
3 | 1 | 已检查 | 身高 | 1.8m |
4 | 1 | 空 | 收入 | $1 |
5 | 1 | 空 | 地址 | 国际空间站 |
6 | 1 | 空 | 才艺 | 跳舞 |
7 | 2 | 已检查 | 年龄 | 20 |
8 | 2 | 空 | 教育 | 高中 |
9 | 2 | 已检查 | 身高 | 4m |
10 | 2 | 空 | 收入 | $3.2 |
11 | 2 | 空 | 地址 | 高海 |
12 | 2 | 空 | 才艺 | 唱歌 |
转换后的示例结果:
id | respondent_id | 年龄 | 身高 | 问题 | 答案 |
---|---|---|---|---|---|
2 | 1 | 30 | 1.8m | 教育 | 硕士 |
4 | 1 | 30 | 1.8m | 收入 | $1 |
5 | 1 | 30 | 1.8m | 地址 | 国际空间站 |
6 | 1 | 30 | 1.8m | 才艺 | 跳舞 |
8 | 2 | 20 | 4m | 教育 | 高中 |
10 | 2 | 20 | 4m | 收入 | $3.2 |
11 | 2 | 20 | 4m | 地址 | 高海 |
12 | 2 | 20 | 4m | 才艺 | 唱歌 |
当前的MySQL语句:
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( '(SELECT l.answer FROM source_table l where l.respondent_id = a.respondent_id AND l.question = ', b.question,') AS ',b.question ) ) INTO @sql FROM source_table b WHERE b.demographic IS NOT NULL; SET @sql = CONCAT('SELECT respondents_id, ',@sql,', a.question , a.answer FROM source_table a WHERE a.demographic IS NULL GROUP BY id '); PREPARE stmt FROM @sql; EXECUTE stmt;
为了澄清,上述查询在有“checked”的人口统计列时有效,但是当没有“checked”单元格时,整个查询失败。
因此,我希望有一个查询在所有情况下都能工作,无论是否有人口统计行。
如果没有人口统计行,则查询应该返回没有新列的数据。
I'm a little confused why you want to use dynamic SQL. Window functions seem to do what you want:
If you don't know the "checked" column, I think you can use this as a template.
@FaNo_FN @ysth
I successfully fixed it using the fiddle you posted and your comment.
I added the following code between the two queries to check if the variable is set.
SET @sql := IF(@sql IS NULL,'',@sql);
I also added a second
CONCAT()
beforeGROUP_CONCAT
to add a ',' separator.This is the link tofiddle.