问题描述
对不起,标题混淆。
我在teradata 16.1上,我有两个表,一个是具有ID和数量的简单表,另一个是具有子ID及其数量的详细表。在第二张表中,金额是子ID的拆分,这些ID构成了ID的数量。
加入这些表时,表A的金额会重复出现(这是显而易见的),但是我只需要获取一次,这样我就可以将该金额与其他表进行调和。考虑两种解决方案(并向其他人开放) ),但不知道如何在sql中实现。图片中的所有内容。
有什么见解吗?
create volatile table main_table
(
id varchar(10),amount decimal(10,2) ) primary index (id) on commit preserve rows;
insert into main_table values ('A1',600); insert into main_table values ('A2',700); insert into main_table values ('A3',800);
create volatile table sub_table
(
id varchar(10),sub_id varchar(10),sub_value decimal(10,2) )
primary index (id,sub_id) on commit preserve rows;
insert into sub_table values ('A1','X1',300); insert into sub_table values ('A1','X2',300);
insert into sub_table values ('A2','Y1',700);
insert into sub_table values ('A3','Z1',200);insert into sub_table values ('A3','Z2',300);insert into sub_table values ('A3','Z3',300);
解决方法
您可以对sub_table中的行进行编号以标识第一行,并在其他行上隐藏main_table金额
WITH
s as (
select ROW_NUMBER() over (partition by id order by subid) n,*
from sub_table
)
select m.id main_id,case when n = 1 then m.value else 0 end main_value,s.id sub_id,s.value
from main_table m
join s on m.id=s.id
结果
main_id main_value sub_id value
A1 600 A1 300
A1 0 A1 300
A2 700 A2 700
A3 800 A3 200
A3 0 A3 300
A3 0 A3 300
,
如果我理解正确,则可以使用JOIN
和一些其他逻辑:
select m.*,s.*,(case when row_number() over (partition by m.id order by s.subid) = 1
then m.amount
else 0
end) as imputed_a_amount
from main_table m left join
sub_table s
on m.id = s.id;
或者:
select m.*,m.amount / count(*) over (partition by m_id) as imputed_a_amount
from main_table m left join
sub_table s
on m.id = s.id;