在连接中使用trunc和concatenate命令

时间:2019-07-04 08:37:45

标签: sql oracle join concatenation truncate

select EDR_Process_Time, MSISDN1, Total_payment/Total_data_MB from 
(

    select trunc(M_MOBILEMV.Q_RA_EDR_DETAILS_V.process_time) as EDR_Process_Time, M_MOBILEMV.Q_RA_EDR_DETAILS_V.MSISDN as MSISDN1, trunc(M_MOBILEMV.Q_RA_CDR_DETAILS_V.CDR_start_Date), M_MOBILEMV.Q_RA_CDR_DETAILS_V.served_msisdn, sum(M_MOBILEMV.Q_RA_CDR_DETAILS_V.charge_fee_1) as Charge_fee_CDR, 
    sum(M_MOBILEMV.Q_RA_EDR_DETAILS_V.charge_fee/100) as Total_Payment,
    sum(M_MOBILEMV.Q_RA_EDR_DETAILS_V.amount/1048576) as Total_data_MB,
    from (M_MOBILEMV.Q_RA_EDR_DETAILS_V 
    left join M_MOBILEMV.Q_RA_CDR_DETAILS_V on concat(trunc(M_MOBILEMV.Q_RA_EDR_DETAILS_V.process_time), M_MOBILEMV.Q_RA_EDR_DETAILS_V.MSISDN) = concat(trunc(M_MOBILEMV.Q_RA_CDR_DETAILS_V.CDR_start_date), M_MOBILEMV.Q_RA_CDR_DETAILS_V.served_MSISDN))

    group by trunc(M_MOBILEMV.Q_RA_EDR_DETAILS_V.Process_time), M_MOBILEMV.Q_RA_EDR_DETAILS_V.MSISDN
group by trunc(M_MOBILEMV.Q_RA_CDR_DETAILS_V.CDR_start_Date), M_MOBILEMV.Q_RA_CDR_DETAILS_V.Served_MSISDN
) 

2 个答案:

答案 0 :(得分:0)

首先,M_MOBILEMV.Q_RA_EDR_DETAILS_V.sum((charge_fee)/100)和其他类似表达式的语法错误。 如果您想要sum表(视图)的charge_fee / 100列中的M_MOBILEMV.Q_RA_EDR_DETAILS_V,则必须 是

sum(M_MOBILEMV.Q_RA_EDR_DETAILS_V.charge_fee/100)

接下来,您不能在引入别名的同一SELECT列表中使用别名。 Total_PaymentTotal_data_MB应该只出现在外部SELECT的表达式中。

将别名分配给内部select的每个表达式,将别名分配给内部select本身,并使用合格名称和表达式的列表,而不是外部*使用这些名称select

此外,似乎缺少GROUP BY

select t.process_time, t.MSISDN, t.sum1, 
  t.Total_Payment,
  t.Total_data_MB,
  t.Total_Payment/t.Total_data_MB as cost_per_MB  
from (
   select 
     M_MOBILEMV.Q_RA_EDR_DETAILS_V.process_time,
     M_MOBILEMV.Q_RA_EDR_DETAILS_V.MSISDN,
     sum(M_MOBILEMV.Q_RA_CDR_DETAILS_V.charge_fee_1) as sum1, 
     (coalesce(sum(M_MOBILEMV.Q_RA_CDR_DETAILS_V.charge_fee_1),0) + coalesce(sum(M_MOBILEMV.Q_RA_EDR_DETAILS_V.charge_fee/100),0)) as Total_Payment,
     sum(M_MOBILEMV.Q_RA_EDR_DETAILS_V.amount)/1048576 as Total_data_MB
     -- Don't you mean
     --GROUP BY M_MOBILEMV.Q_RA_EDR_DETAILS_V.process_time, M_MOBILEMV.Q_RA_EDR_DETAILS_V.MSISDN 
   from (M_MOBILEMV.Q_RA_EDR_DETAILS_V 
          left join M_MOBILEMV.Q_RA_CDR_DETAILS_V on concat(trunc(M_MOBILEMV.Q_RA_EDR_DETAILS_V.process_time), M_MOBILEMV.Q_RA_EDR_DETAILS_V.MSISDN) = concat(trunc(M_MOBILEMV.Q_RA_CDR_DETAILS_V.CDR_start_date), M_MOBILEMV.Q_RA_CDR_DETAILS_V.served_MSISDN)
   ) t
)

答案 1 :(得分:0)

函数的语法错误。将trunc函数用作trunc(M_MOBILEMV.Q_RA_EDR_DETAILS_V.process_time)。总和使用也是错误的。您还应该将它们更改为sum(M_MOBILEMV.Q_RA_CDR_DETAILS_V.charge_fee_1