sql- 多行相同信息时抑制金额取唯一值

sql- suppressing the amount value to get the unique value when its multiple rows of same information

抱歉,标题混乱。

我在 Teradata 16.1 上,我有两个 table,一个是简单的 table,带有 id 和数量,另一个是详细的 table,带有子 id 和它们金额。在第二个 table 中,金额是构成 ID 数量的子 ID 的拆分。

加入这些 table 时,table 金额会重复(这很明显),但我只需要获得一次,以便我可以将该金额与其他金额进行核对 tables.Thinking 的两个解决方案(也向其他人开放)但不知道如何在 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.*, s.*,
       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;