SQL行转列查询:单表/多表实现多行Value值转多列展示
行转列SQL实现方案
你需要的是典型的行转列需求,将同一UniqueID下的多条Value记录转换为多列展示,以下分别提供单表、多表场景的实现语句:
单表实现
假设你的原始数据都存在同一张表original_table中,表结构为:UniqueID(唯一ID)、Value(对应值)。
通用写法(支持MySQL8.0+、PostgreSQL、Oracle、SQL Server等所有支持窗口函数的数据库)
SELECT UniqueID, MAX(CASE WHEN rn = 1 THEN Value END) AS Value1, MAX(CASE WHEN rn = 2 THEN Value END) AS Value2, MAX(CASE WHEN rn = 3 THEN Value END) AS Value3 FROM ( -- 给同一UniqueID下的每一行生成序号,排序规则可按需调整 SELECT UniqueID, Value, ROW_NUMBER() OVER (PARTITION BY UniqueID ORDER BY Value DESC) AS rn FROM original_table ) t GROUP BY UniqueID ORDER BY UniqueID;
低版本MySQL兼容写法(不支持窗口函数的场景)
SELECT UniqueID, SUBSTRING_INDEX(GROUP_CONCAT(Value ORDER BY Value DESC), ',', 1) AS Value1, IF( LENGTH(GROUP_CONCAT(Value ORDER BY Value DESC)) - LENGTH(REPLACE(GROUP_CONCAT(Value ORDER BY Value DESC), ',', '')) >= 1, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(Value ORDER BY Value DESC), ',', 2), ',', -1), NULL ) AS Value2, IF( LENGTH(GROUP_CONCAT(Value ORDER BY Value DESC)) - LENGTH(REPLACE(GROUP_CONCAT(Value ORDER BY Value DESC), ',', '')) >= 2, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(Value ORDER BY Value DESC), ',', 3), ',', -1), NULL ) AS Value3 FROM original_table GROUP BY UniqueID ORDER BY UniqueID;
多表实现
假设你的数据拆分在两张表中:
- 主表
unique_id_main:存储所有唯一ID,仅含UniqueID字段 - 从表
value_detail:存储每个ID对应的多个值,含UniqueID、Value字段,通过UniqueID与主表关联
SELECT m.UniqueID, MAX(CASE WHEN d.rn = 1 THEN d.Value END) AS Value1, MAX(CASE WHEN d.rn = 2 THEN d.Value END) AS Value2, MAX(CASE WHEN d.rn = 3 THEN d.Value END) AS Value3 FROM unique_id_main m LEFT JOIN ( SELECT UniqueID, Value, ROW_NUMBER() OVER (PARTITION BY UniqueID ORDER BY Value DESC) AS rn FROM value_detail ) d ON m.UniqueID = d.UniqueID GROUP BY m.UniqueID ORDER BY m.UniqueID;
如果后续需要展示超过3个Value列,只需要新增对应序号的CASE WHEN分支即可,无需调整其他逻辑。
内容的提问来源于stack exchange,提问作者LOKESH KUMAR
相关产品推荐
相关产品推荐

