You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:36:04