微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql-抑制数量值以在其多行相同信息时获取唯一值

如何解决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);

enter image description here

解决方法

您可以对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 举报,一经查实,本站将立刻删除。