如何解决sql-抑制数量值以在其多行相同信息时获取唯一值
对不起,标题混淆。
我在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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。