暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将数据从一个表的多行插入到另一个表的一行几列。

askTom 2017-02-24
319

问题描述

你好
我被一个问题困住了。

我有一张有几行的表。我想将这些数据合并到另一个表中
总而言之,我想将数据从一个表的多行插入到另一个表的一行几列。

我的表格来源有以下列
表格来源
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);

提交;

专家解答

你需要做枢轴!这可以根据需要将行转换为列:

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论