SQL中如何不使用UNION将多个同类列数据转换为行格式
非UNION实现宽表拆多行的SQL方案
核心思路是通过笛卡尔积关联一个仅含2行的拆分标识虚拟表,把原表单行数据拆分为对应售前、售后两类成本的两行数据,再通过条件判断取对应字段值即可,全程不涉及UNION语法。
如果使用支持VALUES语法的数据库(MySQL 8.0+、PostgreSQL、Spark SQL、Hive等均支持),可直接用如下写法:
SELECT t.ItemName, CASE split.flag WHEN 'presale' THEN t.`1mth_presale_cost` WHEN 'postsale' THEN t.`1mth_postsale_cost` END AS 1mth_cost, CASE split.flag WHEN 'presale' THEN t.`2mth_presale_cost` WHEN 'postsale' THEN t.`2mth_postsale_cost` END AS 2mth_cost FROM 你的原表名 t -- 用VALUES构造2行拆分标识,无任何UNION逻辑 CROSS JOIN (VALUES ('presale'), ('postsale')) AS split(flag) ORDER BY t.ItemName, split.flag;
如果使用不支持VALUES语法的旧版本数据库,也可以通过库内已有小表构造拆分用的2行数据,示例如下(以自带dual系统表的数据库为例):
SELECT t.ItemName, IF(split.id = 1, t.`1mth_presale_cost`, t.`1mth_postsale_cost`) AS 1mth_cost, IF(split.id = 1, t.`2mth_presale_cost`, t.`2mth_postsale_cost`) AS 2mth_cost FROM 你的原表名 t CROSS JOIN ( SELECT 1 AS id FROM dual UNION ALL SELECT 2 AS id FROM dual ) split ORDER BY t.ItemName, split.id;
注:如果完全不允许出现任何UNION相关关键字,可提前创建一个仅含2行数据的固定拆分表来替代上面的子查询即可。
内容的提问来源于stack exchange,提问作者Justalearner
相关产品推荐
相关产品推荐

