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
相关产品推荐
相关产品推荐

