【问题标题】:count distinct if a condition is satisfied如果满足条件,则计数不同
【发布时间】:2020-08-31 16:36:17
【问题描述】:

我有一张表,它显示 address_no 是否有电话。为了确定,我正在查看 cell_phone 和 house_phone 列,并且仅当 house_phone 和 cell_phone 为空时才想写“无电话”。

每个 address_no 都有居住在该地址的人的记录。如果至少一个人有电话或 house_phone 不为空,则 address_no 有电话,否则 address_no 没有电话信息。

ADDRESS_NO------PERSON_ID------CELL_PHONE-------HOUSE_PHONE
11111-----------11-------------111000----------------------  
11111-----------12-------------122000----------------------
11111-----------13----------------------------------1313000
22222-----------21----------------------------------2121000
33333-----------31-----------------------------------------
33333-----------32-----------------------------------------
44444-----------41-------------411000---------------4141000
55555-----------51-------------511000----------------------
55555-----------52-----------------------------------------
55555-----------53-----------------------------------------

如上所示,我希望得到 5 个地址中有 4 个有电话信息的结果。

我如何编写一个 sql 查询来查找 oracle sql 中的数字

【问题讨论】:

标签: sql oracle count average distinct


【解决方案1】:

您可以使用聚合和case 表达式:

select address_id,
       (case when max(cell_phone) is null and max(house_phone) is null
             then 'No Phone' else 'Phone'
        end) as phone_flag
from t
group by address_id;

【讨论】:

    【解决方案2】:

    如果要列出有电话信息的地址,可以使用having 子句过滤数据集:

    select address_no
    from mytable
    group by address_no
    having coalesce(max(cell_phone), max(house_phone)) is not null
    

    另一方面,如果您想计算具有电话信息的地址的总体比例,您可以使用两个级别的聚合:

    select avg(case when phone_no is null then 0 else 1 end) ratio
    from (
        select coalesce(max(cell_phone), max(house_phone)) phone_no
        from mytable
        group by address_no
    ) t
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 2020-08-18
      • 2023-03-14
      相关资源
      最近更新 更多