我写了一个查询,根据条件将几行转换为列。
然而,有些情况下没有行满足条件,但我希望返回一些结果。
下面是表格的示例和我要寻找的结果。
源表:
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”单元格时,整个查询失败。
因此,我希望有一个查询在所有情况下都能工作,无论是否有人口统计行。
如果没有人口统计行,则查询应该返回没有新列的数据。
동적 SQL을 사용하려는 이유가 조금 혼란스럽습니다. 창 기능이 원하는 대로 작동하는 것 같습니다:
으아악'체크됨' 열을 모르신다면 템플릿으로 사용해도 될 것 같아요.
@FaNo_FN @ysth
귀하가 게시한 바이올린과 귀하의 의견을 사용하여 성공적으로 수정했습니다.
변수가 설정되었는지 확인하기 위해 두 쿼리 사이에 다음 코드를 추가했습니다.
SET @sql := IF(@sql IS NULL,'',@sql);
아직
GROUP_CONCAT
之前添加了第二个CONCAT()
',' 구분 기호를 추가하는 중입니다.여기에fiddle링크가 있습니다.