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

SQL表互转及建表问题:表1与表2的双向转换实现

Got it,我来帮你搞定这几个SQL相关的需求,一步步给你拆解:

创建Table1和Table2的SQL语句

创建Table1(含示例数据)

CREATE TABLE Table1 (
    Col1 VARCHAR(50) PRIMARY KEY,
    A INT,
    B INT,
    C INT
);

-- 插入示例数据
INSERT INTO Table1 (Col1, A, B, C)
VALUES ('N1', 1, 0, 0),
       ('N2', 0, 1, 0),
       ('N3', 1, 0, 0);

创建Table2

CREATE TABLE Table2 (
    output VARCHAR(50) PRIMARY KEY,
    new_col VARCHAR(50)
);
从Table1生成Table2的方法

根据你的示例数据,每行只有一个列值为1,这里提供两种常用方法:

方法1:CASE语句(适合单行仅一个1的场景)

这种方法逻辑直观,直接匹配每行的1所在列:

INSERT INTO Table2 (output, new_col)
SELECT 
    Col1 AS output,
    CASE
        WHEN A = 1 THEN 'A'
        WHEN B = 1 THEN 'B'
        WHEN C = 1 THEN 'C'
        ELSE NULL  -- 处理无1的异常行
    END AS new_col
FROM Table1;

方法2:UNION ALL(支持单行多1的场景)

如果你的实际数据中可能存在同一行多个列值为1的情况,这种方法会为每个1生成一条记录,更灵活:

INSERT INTO Table2 (output, new_col)
SELECT Col1, 'A' FROM Table1 WHERE A = 1
UNION ALL
SELECT Col1, 'B' FROM Table1 WHERE B = 1
UNION ALL
SELECT Col1, 'C' FROM Table1 WHERE C = 1;
从Table2反向生成Table1的方法

这里需要把new_col的行值转成列,也就是行转列操作,同样提供两种兼容不同数据库的方法:

方法1:条件聚合(兼容绝大多数数据库)

这种方法不依赖数据库特定语法,通用性最强:

-- 如果Table1已存在,用INSERT INTO;如果要新建表,用CREATE TABLE ... AS
CREATE TABLE Table1_new AS
SELECT 
    output AS Col1,
    MAX(CASE WHEN new_col = 'A' THEN 1 ELSE 0 END) AS A,
    MAX(CASE WHEN new_col = 'B' THEN 1 ELSE 0 END) AS B,
    MAX(CASE WHEN new_col = 'C' THEN 1 ELSE 0 END) AS C
FROM Table2
GROUP BY output;

方法2:PIVOT语法(适合支持该语法的数据库,如SQL Server、Oracle)

如果你的数据库支持PIVOT,可以用更简洁的语法:

CREATE TABLE Table1_new AS
SELECT 
    output AS Col1,
    ISNULL(A, 0) AS A,
    ISNULL(B, 0) AS B,
    ISNULL(C, 0) AS C
FROM Table2
PIVOT (
    COUNT(new_col)  -- 因为每个output对应一个new_col,COUNT/MAX(1)结果一致
    FOR new_col IN ([A], [B], [C])
) AS PivotResult;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:02:30