如果是oracle sql子句的话

时间:2014-07-03 10:30:45

标签: sql oracle

我有以下查询

    select
    Case
    -- Here 
    When count(distinct g.mobile_no) > 0 Then con.IR_BILLING_GROUP_CODE = bil.billing_group_code Else g.mobile_no END mobile_no,     
    cu.customer_no, bil.billing_group_code bil
from customers cu
  inner join billings bil on bil.code = cu.code
  inner join mobile_no g on g.mobile_no = bil.mobile_no
  inner join billing_group con on con.code = bil.code

它所说的"在这里"上面我想添加以下限制。如果从检索到的移动电话号码中有重复项(这是因为相同号码的列帐单中有不同的帐单组),那么我想添加限制con.IR_BILLING_GROUP_CODE = bil.billing_group_code,它将只返回相关的帐单组因此,不会显示错误的重复手机号码?上面的代码说缺少关键字?

实施例

  Customer    Mobile No    Bil
  123         01243473     02
  123         05532234     02
  123         05532234     05

因为05532234由于不同的计费组而有重复,所以我需要对列bil进行过滤。如果我添加限制 con.IR_BILLING_GROUP_CODE = bil.billing_group_code然后bil = 02或bil = 05,这样我就知道哪个是05532234的正确计费组。我希望这是有道理的。

1 个答案:

答案 0 :(得分:1)

您不能在选择列表中放置where子句条件。如果没有分组,您也不能使用聚合函数(COUNT)和非聚合列。

您可以为每位客户的记录添加行号,并将最佳匹配的帐单(con.ir_billing_group_code = bil.billing_group_code)放在第一位。然后过滤结果,例如只获得最匹配的行,即只有行号1。

select customer_no, bil, mobile_no
from
(
  select
    cu.customer_no, bil.billing_group_code bil, g.mobile_no,
    row_number over (partition by cu.customer_no, bil.billing_group_code
                     order by 
                       case when con.ir_billing_group_code = bil.billing_group_code
                         then 0 
                         else 1 
                       end
                    ) as rn
  from customers cu
  inner join billings bil on bil.code = cu.code
  inner join mobile_no g on g.mobile_no = bil.mobile_no
  inner join billing_group con on con.code = bil.code
)
where rn = 1;