我写了一个查询,根据条件将几行转换为列。
然而,有些情况下没有行满足条件,但我希望返回一些结果。
下面是表格的示例和我要寻找的结果。
源表:
| 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”单元格时,整个查询失败。
因此,我希望有一个查询在所有情况下都能工作,无论是否有人口统计行。
如果没有人口统计行,则查询应该返回没有新列的数据。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
我有点困惑为什么你要使用动态SQL。窗口函数似乎可以实现你想要的功能:
select t.* from (select t.*, max(case when question = 'Age' then answer end) over (partition by respondent_id ) as age, max(case when question = 'height' then answer end) over (partition by respondent_id ) as height from source_table st ) t where demographic is null;如果你不知道“checked”列,我想你可以将此作为模板使用。
@FaNo_FN @ysth
我使用你发布的fiddle和你的评论成功修复了它。
我在两个查询之间添加了以下代码来检查变量是否设置。
SET @sql := IF(@sql IS NULL,'',@sql);我还在
GROUP_CONCAT之前添加了第二个CONCAT()来添加一个','分隔符。这是fiddle的链接。