【问题标题】:SQL developer - Finding distinct phone numbers when 2 phone number columns existSQL 开发人员 - 当存在 2 个电话号码列时查找不同的电话号码
【发布时间】:2021-03-10 08:15:05
【问题描述】:

我需要计算(在 SQL 开发人员中)客户拥有多少个唯一电话号码。 客户可以拥有 2 个不同的电话号码(PHONE1 - 移动电话,PHONE2 - 桌面电话),并且通常为一个客户注册许多不同的电话号码(这取决于注册类型)。

我用 CASE WHEN 尝试了不同的方法,但没有成功。 你有什么想法吗?

谢谢。

在下面的例子中,计数应该是 3。

CUSTOMER  PHONE1   PHONE2
abc       123456   123456
abc       123456
abc       654321   777777
abc       654321

在这种情况下,计数应该等于 3。如: 第一行 - 电话匹配,然后将其视为 1 个唯一电话号码。 第二行 - 与第一行相同,仍然是 1 个唯一的电话号码。 第三行 - phone1 和 phone2 不匹配,2 个唯一号码。 第 4 行 - 与第 3 行相同,然后共有 3 个唯一数字。

【问题讨论】:

  • 样本数据很好,但您也应该指定预期结果。

标签: sql oracle


【解决方案1】:

您可以使用 LATERAL 取消转置电话号码

WITH tbl(CUSTOMER,  PHONE1,   PHONE2) AS (
     SELECT'abc', '123456', '123456' FROM DUAL UNION ALL 
     SELECT'abc', '123456', NULL     FROM DUAL UNION ALL 
     SELECT'abc', '654321', '777777' FROM DUAL UNION ALL 
     SELECT'abc', '654321', NULL     FROM DUAL       
)
SELECT CUSTOMER, COUNT(DISTINCT p) cnt  
FROM tbl 
CROSS JOIN LATERAL (
    SELECT PHONE1 p FROM DUAL
    UNION
    SELECT PHONE2 FROM DUAL
  ) t
GROUP BY CUSTOMER

【讨论】:

    【解决方案2】:
    WITH CTE(CUSTOMER,  PHONE1,   PHONE2) AS
      (
    
         SELECT 'abc',       '123456',   '123456' UNION ALL 
         SELECT'abc' ,      '123456',    ' '      UNION ALL 
         SELECT'abc' ,      '654321' ,  '777777'  UNION ALL 
         SELECT'abc' ,      '654321',   ' '        
      )
      SELECT COUNT(DISTINCT PHONE1)FROM 
      (
        SELECT PHONE1 FROM CTE AS C
           UNION ALL 
        SELECT PHONE2 FROM CTE AS C2
     )X WHERE X.PHONE1<>' '
    

    我想,你可以试试上面的查询。我用空字符串('')替换了不存在的电话,在你的情况下它可能是 NULL 值,那么你需要用 X.PHONE1 IS NOT NULL 替换 X.PHONE1&lt;&gt;' '

    【讨论】:

    • 嗨,谢谢,但我有一个包含数百万行的电话表,然后想知道我是否真的可以在第一个括号中使用 UNION ALL?
    • 在我看来,在这种情况下,问题不在于 UNION ALL,而在于 COUNT DISTINCT 的性能
    • 在 CTE 中的所有 SELECT 语句中都缺少 FROM DUAL
    【解决方案3】:
    Select
        COUNT(DISTINCT(phones)) 
    FROM
    (
        SELECT
            phone  AS phones 
        FROM
            customers 
        UNION ALL
        SELECT
            phone2 AS phones
        FROM
            customers
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2016-04-15
      • 1970-01-01
      • 2015-01-13
      相关资源
      最近更新 更多