如何对两个表中的列值求和并保留仅在一个表中的另一列

时间:2017-12-08 16:43:47

标签: sql oracle select

我创建了表itemitem2,我知道它可能是数据冗余,但我想知道如何选择它并创建一个视图?

create table item(
id  number(10) primary key,
name varchar2(20),
mark number(10));
insert into item values(10,'Apple1',23);
insert into item values(11,'Apple2',0);
insert into item values(12,'Apple3',0);
insert into item values(13,'Apple4',0);
insert into item values(14,'Apple4',0);
insert into item values(15,'Apple4',0);
insert into item values(16,'Apple4',0);

create table  item2(
id number(10),
mark number(10));
alter table item2 add(constraint id_fk FOREIGN KEY (id) references  item(id));
Insert into  item2 values(10,1);
Insert into  item2 values(10,1);
Insert into  item2 values(11,7);
Insert into  item2 values(12,14);

我可以同时查询:

select * from item;

ID  Name    Mark
10  Apple1    23
11  Apple2     0
12  Apple3     0
13  Apple4     0
14  Apple4     0
15  Apple4     0
16  Apple4     0

select * from item2;

ID  Mark
10     1
10     1
11     7
12    14

我想使用itemitem2表中的select语句求和得到下面的结果集:

ID  Name    Mark
10  Apple1    25
11  Apple2     7
12  Apple3    14
13  Apple4     0
14  Apple4     0
15  Apple4     0
16  Apple4     0

如何组合查询以产生输出?

3 个答案:

答案 0 :(得分:2)

如果我理解正确,你想“假装”第二个表也有NAME列,根据第一个表填充;然后你想要GROUP BY id并获得sum of MARK

如果是这样,您可以使用UNION ALL,而不是连接表来获取名称(在组合表和计算总和之前或之后),在其中插入假NAME第二个表中包含NULL的列;然后是group by id,您对MARK列求和,然后MAX超过NAMEMAX忽略NULL,因此它只会从表ITEM中选择名称。

下面的解决方案遵循每个细节的逻辑。

select   id, max(name) as name, sum(mark) as mark
from     ( select id, name, mark
             from item
           union all
           select id, null as name, mark
             from item2
         )
group by id
;

答案 1 :(得分:1)

您可以在id和mark上将两个表合并在一起。您可以在联合中添加空名称列,并在该字段上执行最大/最小值以从该表中获取一个值。否则,您可以将id和标记合并,然后使用名称连接回原始表,从中获取它并将其包含在组中。

select item_table.id, item_table.name, sum(mark_data_set.mark) as mark_score
from
(select 
    id, mark 
from item
union all
select id, mark
from item2
) mark_data_set
inner join item item_table on (mark_data_set.id = item_table.id)
group by item_table.id, item_table.name

答案 2 :(得分:1)

这个怎么样?

select  id,name,(m1 +nvl(m2,0)) mark
from
(select t1.id,t1.name,t1.mark m1,t2.mark m2
from
item t1 
LEFT OUTER JOIN
(select id,sum(mark) mark from item2
group by id) t2
ON
t2.id = t1.id
)
order by id;