我有以下查询
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的正确计费组。我希望这是有道理的。
答案 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;