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

如何用SQL Pivot将Quantity与Net列合并为Account和Value列?

实现SQL表的逆透视(Unpivot)操作

你需要的是**逆透视(Unpivot)**操作(注意:Pivot是行转列,这里是列转行,属于逆透视),将Quantity和Net列转换为Account(列名)和Value(对应值)的行维度对,以下是几种不同场景的实现方案:

原表结构与数据

LocationTypeDateQuantityNet
A1Base25-Jan1040
A1Premium25-Jan530
A2Premium26-Jan318
B1Base27-Jan416
B2Base24-Jan832
B2Premium25-Jan212

目标表结构与数据

LocationTypeDateAccountValue
A1Base25-JanNet40
A1Base25-JanQuantity10
A1Premium25-JanNet30
A1Premium25-JanQuantity5
A2Premium26-JanNet18
A2Premium26-JanQuantity3
B1Base27-JanNet16
B1Base27-JanQuantity4
B2Base24-JanNet32
B2Base24-JanQuantity8
B2Premium25-JanNet12
B2Premium25-JanQuantity2

方法1:通用UNION ALL实现(全数据库兼容)

这是兼容性最强的方案,适用于所有支持UNION ALL的SQL数据库:

SELECT Location, Type, Date, 'Net' AS Account, Net AS Value
FROM your_table_name
UNION ALL
SELECT Location, Type, Date, 'Quantity' AS Account, Quantity AS Value
FROM your_table_name
ORDER BY Location, Type, Date, Account DESC; -- 排序用于匹配目标表顺序,可按需调整
  • 逻辑:分别提取Net和Quantity列的数据,将列名作为Account值,列值作为Value,再合并结果集。

方法2:UNPIVOT语法实现(SQL Server、Oracle等支持的数据库)

如果你的数据库支持原生UNPIVOT关键字,可用更简洁的语法:

SELECT Location, Type, Date, Account, Value
FROM your_table_name
UNPIVOT (
    Value FOR Account IN (Net, Quantity)
) AS unpivoted_data
ORDER BY Location, Type, Date, Account DESC;
  • 逻辑:通过UNPIVOT子句直接指定要转换的列(Net、Quantity),自动生成Account(列名)和Value(列值)字段。

方法3:PostgreSQL专属实现

PostgreSQL无原生UNPIVOT,可通过LATERAL JOIN或ARRAY+UNNEST实现,推荐更清晰的LATERAL JOIN方式:

SELECT
    t.Location,
    t.Type,
    t.Date,
    u.Account,
    u.Value
FROM your_table_name t
LATERAL (
    VALUES
        ('Net', t.Net),
        ('Quantity', t.Quantity)
) u(Account, Value)
ORDER BY Location, Type, Date, Account DESC;

内容的提问来源于stack exchange,提问作者CraigA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:56:05