提问人:Megha 提问时间:10/21/2023 最后编辑:Megha 更新时间:10/21/2023 访问量:42
通过对现有表的列进行条件调整来创建新表
creating new table by conditioning on columns of existing table
问:
我是一个新的sql学习者。我遇到了以下问题:
假设我有下表:
编号 | 细节 |
---|---|
答1 | 11 |
答1 | 12 |
答1 | 零 |
答1 | 0 |
答2 | 11 |
答2 | 13 |
现在,我想创建一个包含两列 ID 和结果(例如)的新表,其中每个 ID 出现一次。如果与 ID 对应的任何行在详细信息列中有 12,则 result = 1,否则为 0。所以基本上我的结果应该是下表:
编号 | 细节 |
---|---|
答1 | 1 |
答2 | 0 |
我试图解决这个问题的尝试是:
insert into new_table select ID, (select detail,
(case
when detail = 12 then '0'
else '1'
end) as new_column from table)
from table;
但是这段代码给了我错误:操作数应该包含 1 列。我不知道如何处理这个问题。请帮助我了解如何解决这个问题。我正在MySql中尝试这个。
答:
3赞
Isolated
10/21/2023
#1
使用 CTAS 语句创建表,并使用带有聚合的案例表达式。
create table table2 as (
select id,
max(case when detail = 12 then 1 else 0 end) as detail
from table1
group by id
);
编号 | 细节 |
---|---|
答1 | 1 |
答2 | 0 |
1赞
Bill Karwin
10/21/2023
#2
您不需要子查询。您可以直接在选择列表中创建表达式。
使用 GROUP BY 使结果每个 ID 值有一行。
INSERT INTO new_table
SELECT ID, MAX(CASE detail WHEN 12 THEN 1 ELSE 0 END)
FROM old_table
GROUP BY ID;
1赞
nbk
10/21/2023
#3
EXISTS
将只返回正确的标量值,并且速度很快
CREATE TABLE old_table
(`ID` varchar(2), `detail` varchar(4))
;
INSERT INTO old_table
(`ID`, `detail`)
VALUES
('A1', '11'),
('A1', '12'),
('A1', NULL),
('A1', '0'),
('A2', '11'),
('A2', '13')
;
Records: 6 Duplicates: 0 Warnings: 0
CREATE TABLE new_table
(`ID` varchar(2), `detail` varchar(4))
;
INSERT INTO new_table
SELECT DISTINCT ID, (EXISTS(SELECT 1 FROM old_table o2 WHERE o2.`detail` = 12 AND o2.ID = o1.ID))
FROM old_table o1
Records: 2 Duplicates: 0 Warnings: 0
SELECT* FROM new_table
编号 | 细节 |
---|---|
答1 | 1 |
答2 | 0 |
评论