SQL行转列查询缺失数据时如何显示空值而非过滤整条记录
问题原因
你当前使用的是内连接(INNER JOIN),逻辑要求同一个id必须同时存在Name、Gender、Code三类数据才能匹配成功返回记录,id=2缺少Code类型的数据,所以直接被过滤掉了。
解法1:修改JOIN逻辑(适配现有写法)
将Code表的关联改为左连接(LEFT JOIN),同时把Code的类型筛选条件写在JOIN的匹配规则中,避免过滤缺失Code的记录:
SELECT a.id, a.data AS `Name`, b.data AS `Gender`, c.data AS `Code` FROM table1 a INNER JOIN table1 b ON a.id = b.id AND a.type = 'Name' AND b.type = 'Gender' LEFT JOIN table1 c ON a.id = c.id AND c.type = 'Code'
解法2:聚合行转列(更通用推荐)
不需要多次关联表,用条件聚合的方式实现,兼容性更强,后续新增字段也更方便,缺失的字段会自动返回NULL:
SELECT id, MAX(CASE WHEN type = 'Name' THEN data END) AS `Name`, MAX(CASE WHEN type = 'Gender' THEN data END) AS `Gender`, MAX(CASE WHEN type = 'Code' THEN data END) AS `Code` FROM table1 GROUP BY id
两种写法都可以得到你预期的结果,缺失的Code字段会自动显示为NULL/空值。
内容的提问来源于stack exchange,提问作者Reus ellmy
相关产品推荐
相关产品推荐

