问题描述
你好
我被一个问题困住了。
我有一张有几行的表。我想将这些数据合并到另一个表中
总而言之,我想将数据从一个表的多行插入到另一个表的一行几列。
我的表格来源有以下列
表格来源
K1、K2、K3、年、月、值
其中K1 K2 K3年月份每行唯一
最多有12行 (但并非总是如此,某些月份可能会错过),其中K1 K2 K3年月份为唯一值
我想将这些行插入到一个表中
表目标
K1 K2 K3年1月2月3月4月5月6月7月8月9月10月11月12月
这意味着如果在表源中月份为1,则值列必须进入JAN列
这意味着如果在表源中月份为2,则值列必须进入FEB列
有没有办法用sql查询做到这一点?
问候
米凯尔
请在以前的电子邮件中找到以下样本
我正在寻找的sql查询的结果应该是2行插入到TBL_COLUMN中,一行为uniq 1000,一行2016的值仅用于RES_M01 (1月) 和RES_M03 (3月),一行为uniq 2000 2016的值仅用于1月RES_M01和4月 (RES_M04)
创建表 “TBL_LINE”
(
-- 序列
“LINEID” 编号 (38,0) 默认0不为空启用,
-- uniq
“K1” 号 (38,0) 默认0不为空启用,
“年份” 编号 (4,0) 默认0不为空启用,
“月” 号 (2,0) 默认0不为空启用,
“值” 数字 (*,0),
约束 "KLINEID" 主键 ("LINEID"),
约束 “FLINEID” 唯一 (“K1”,“年”,“月”)
);
创建序列 “LINEID_SEQ” MINVALUE 100 MAXVALUE 999999999999999999999999999增量由1开始100缓存20 NOORDER NOCYCLE;
创建表 “TBL_COLUMN”
(
-- 序列
“COLUMNID” 编号 (38,0) 默认0不为空启用,
-- uniq
“K1” 号 (38,0) 默认0不为空启用,
“年份” 编号 (4,0) 默认0不为空启用,
“RES_M01” 编号 (*,0),
"RES_M02" 号 (*,0),
“RES_M03” 编号 (*,0),
"RES_M04" 号 (*,0),
“RES_M05” 编号 (*,0),
“RES_M06” 编号 (*,0),
"RES_M07" 号 (*,0),
“RES_M08” 编号 (*,0),
"RES_M09" 号 (*,0),
“RES_M10” 编号 (*,0),
“RES_M11” 编号 (*,0),
“RES_M12” 编号 (*,0),
约束 "KCOLUMNID" 主键 ("COLUMNID"),
约束 “FCOLUMNID” 唯一 (“K1”,“年份”)
);
创建序列 “COLUMNID_SEQ” MINVALUE 100 MAXVALUE 999999999999999999999999999增量由1开始100缓存20 NOORDER NOCYCLE;
-为2016年1月插入值10,键1000
插入到TBL_LINE值 (LINEID_SEQ.NEXTVAL,1000,2016,1,10);
-为2016年3月插入值10,键1000
插入到TBL_LINE值 (LINEID_SEQ.NEXTVAL,1000,2016,3,10);
-为2016年1月插入值10,键2000
插入到TBL_LINE值 (LINEID_SEQ.NEXTVAL,2000,2016,1,10);
-为2016年4月插入值10,键2000
插入到TBL_LINE值 (LINEID_SEQ.NEXTVAL,2000,2016,4,10);
提交;
我被一个问题困住了。
我有一张有几行的表。我想将这些数据合并到另一个表中
总而言之,我想将数据从一个表的多行插入到另一个表的一行几列。
我的表格来源有以下列
表格来源
K1、K2、K3、年、月、值
其中K1 K2 K3年月份每行唯一
最多有12行 (但并非总是如此,某些月份可能会错过),其中K1 K2 K3年月份为唯一值
我想将这些行插入到一个表中
表目标
K1 K2 K3年1月2月3月4月5月6月7月8月9月10月11月12月
这意味着如果在表源中月份为1,则值列必须进入JAN列
这意味着如果在表源中月份为2,则值列必须进入FEB列
有没有办法用sql查询做到这一点?
问候
米凯尔
请在以前的电子邮件中找到以下样本
我正在寻找的sql查询的结果应该是2行插入到TBL_COLUMN中,一行为uniq 1000,一行2016的值仅用于RES_M01 (1月) 和RES_M03 (3月),一行为uniq 2000 2016的值仅用于1月RES_M01和4月 (RES_M04)
创建表 “TBL_LINE”
(
-- 序列
“LINEID” 编号 (38,0) 默认0不为空启用,
-- uniq
“K1” 号 (38,0) 默认0不为空启用,
“年份” 编号 (4,0) 默认0不为空启用,
“月” 号 (2,0) 默认0不为空启用,
“值” 数字 (*,0),
约束 "KLINEID" 主键 ("LINEID"),
约束 “FLINEID” 唯一 (“K1”,“年”,“月”)
);
创建序列 “LINEID_SEQ” MINVALUE 100 MAXVALUE 999999999999999999999999999增量由1开始100缓存20 NOORDER NOCYCLE;
创建表 “TBL_COLUMN”
(
-- 序列
“COLUMNID” 编号 (38,0) 默认0不为空启用,
-- uniq
“K1” 号 (38,0) 默认0不为空启用,
“年份” 编号 (4,0) 默认0不为空启用,
“RES_M01” 编号 (*,0),
"RES_M02" 号 (*,0),
“RES_M03” 编号 (*,0),
"RES_M04" 号 (*,0),
“RES_M05” 编号 (*,0),
“RES_M06” 编号 (*,0),
"RES_M07" 号 (*,0),
“RES_M08” 编号 (*,0),
"RES_M09" 号 (*,0),
“RES_M10” 编号 (*,0),
“RES_M11” 编号 (*,0),
“RES_M12” 编号 (*,0),
约束 "KCOLUMNID" 主键 ("COLUMNID"),
约束 “FCOLUMNID” 唯一 (“K1”,“年份”)
);
创建序列 “COLUMNID_SEQ” MINVALUE 100 MAXVALUE 999999999999999999999999999增量由1开始100缓存20 NOORDER NOCYCLE;
-为2016年1月插入值10,键1000
插入到TBL_LINE值 (LINEID_SEQ.NEXTVAL,1000,2016,1,10);
-为2016年3月插入值10,键1000
插入到TBL_LINE值 (LINEID_SEQ.NEXTVAL,1000,2016,3,10);
-为2016年1月插入值10,键2000
插入到TBL_LINE值 (LINEID_SEQ.NEXTVAL,2000,2016,1,10);
-为2016年4月插入值10,键2000
插入到TBL_LINE值 (LINEID_SEQ.NEXTVAL,2000,2016,4,10);
提交;
专家解答
你需要做枢轴!这可以根据需要将行转换为列:
从这里开始,这只是将结果插入到另一个表中的问题。
有关旋转的更详细说明,请阅读:
https://blogs.oracle.com/sql/entry/how_to_convert_rows_to
CREATE TABLE "TBL_LINE" ( --sequence "LINEID" NUMBER(38,0) DEFAULT 0 NOT NULL ENABLE, --uniq "K1" NUMBER(38,0) DEFAULT 0 NOT NULL ENABLE, "YEAR" NUMBER(4,0) DEFAULT 0 NOT NULL ENABLE, "MONTH" NUMBER(2,0) DEFAULT 0 NOT NULL ENABLE, "VALUE" NUMBER(*,0), CONSTRAINT "KLINEID" PRIMARY KEY ("LINEID"), CONSTRAINT "FLINEID" UNIQUE ("K1","YEAR", "MONTH") ); CREATE SEQUENCE "LINEID_SEQ" MINVALUE 100 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 100 CACHE 20 NOORDER NOCYCLE ; --Insert value 10 for january 2016, key 1000 Insert into TBL_LINE values (LINEID_SEQ.NEXTVAL, 1000,2016,1,10); --Insert value 10 for march 2016, key 1000 Insert into TBL_LINE values (LINEID_SEQ.NEXTVAL, 1000,2016,3,10); --Insert value 10 for january 2016, key 2000 Insert into TBL_LINE values (LINEID_SEQ.NEXTVAL, 2000,2016,1,10); --Insert value 10 for april 2016, key 2000 Insert into TBL_LINE values (LINEID_SEQ.NEXTVAL, 2000,2016,4,10); select * from ( select k1, year, month, value from tbl_line ) pivot ( min(value) for month in (1 as JAN, 2 as FEB, 3 as MAR) -- add other months as needed ); K1 YEAR JAN FEB MAR 1,000 2,016 10 10 2,000 2,016 10复制
从这里开始,这只是将结果插入到另一个表中的问题。
有关旋转的更详细说明,请阅读:
https://blogs.oracle.com/sql/entry/how_to_convert_rows_to
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1453次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
882次阅读
2025-03-17 11:33:53
RAC 19C 删除+新增节点
gh
541次阅读
2025-03-14 15:44:18
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
498次阅读
2025-03-13 14:38:19
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
426次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
368次阅读
2025-03-26 23:27:33
墨天轮个人数说知识点合集
JiekeXu
314次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
285次阅读
2025-04-08 09:12:48
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
266次阅读
2025-03-24 09:42:53
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
266次阅读
2025-03-19 14:41:51