【问题标题】:SQL logic to fail a check if any of the related customers has failedSQL 逻辑检查是否有任何相关客户失败
【发布时间】:2021-09-19 15:58:13
【问题描述】:

只有当所有相关客户也都通过检查时,我才有要求标记客户 Y。 下面是两张表:

关系表:

customer_id related_customer
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
11 11
11 22
22 11
22 22

检查表

customer_id check_flag
1 y
2 y
3 n
11 y
22 y

我想要如下输出:

customer_id  paas_fail_flag
1 n
2 n
3 n
11 y
22 y

输出理由:因为 1,2,3 是相关客户,并且由于其中一个 (3) 在表 2 中有 n,所以所有相关客户也应该有 n。 11,22 是相关客户,并且在表 2 中都有 y。所以在输出中都应该有 y。

【问题讨论】:

    标签: sql oracle join count teradata


    【解决方案1】:

    您需要将relationship 加入check 并使用条件聚合:

    SELECT r.customer_id,
           COALESCE(MAX(CASE WHEN c.check_flag = 'n' THEN c.check_flag END), 'y') paas_fail_flag  
    FROM relationship r INNER JOIN "check" c 
    ON c.customer_id = r.related_customer
    GROUP BY r.customer_id
    ORDER BY r.customer_id
    

    请参阅demo

    【讨论】:

    • 谢谢,我想知道条件聚合什么时候在c2上,为什么我们要加入两次
    • @TrishanJaiswal 我猜你是对的。我编辑了。但是您应该知道,这只有在relationship 每个客户至少有 1 行时才有效。如果客户没有关系,那么您需要加入 2 份支票。
    【解决方案2】:

    这样的?第 1 - 40 行中的样本数据;查询从第 41 行开始:

    SQL> WITH
      2     -- sample data
      3     rel (customer_id, related_customer)
      4     AS
      5        (SELECT 1, 1 FROM DUAL
      6         UNION ALL
      7         SELECT 1, 2 FROM DUAL
      8         UNION ALL
      9         SELECT 1, 3 FROM DUAL
     10         UNION ALL
     11         SELECT 2, 1 FROM DUAL
     12         UNION ALL
     13         SELECT 2, 2 FROM DUAL
     14         UNION ALL
     15         SELECT 2, 3 FROM DUAL
     16         UNION ALL
     17         SELECT 3, 1 FROM DUAL
     18         UNION ALL
     19         SELECT 3, 2 FROM DUAL
     20         UNION ALL
     21         SELECT 3, 3 FROM DUAL
     22         UNION ALL
     23         SELECT 11, 11 FROM DUAL
     24         UNION ALL
     25         SELECT 11, 22 FROM DUAL
     26         UNION ALL
     27         SELECT 22, 11 FROM DUAL
     28         UNION ALL
     29         SELECT 22, 22 FROM DUAL),
     30     chk (customer_id, check_flag)
     31     AS
     32        (SELECT 1, 'y' FROM DUAL
     33         UNION ALL
     34         SELECT 2, 'y' FROM DUAL
     35         UNION ALL
     36         SELECT 3, 'n' FROM DUAL
     37         UNION ALL
     38         SELECT 11, 'y' FROM DUAL
     39         UNION ALL
     40         SELECT 22, 'y' FROM DUAL),
    

     41     temp
     42     AS
     43     -- minimum CHECK_FLAG per customer and related customer
     44        (  SELECT r.customer_id, r.related_customer, MIN (c.check_flag) mcf
     45             FROM rel r JOIN chk c ON c.customer_id = r.related_customer
     46         GROUP BY r.customer_id, r.related_customer)
     47    SELECT customer_id, MIN (mcf) flag
     48      FROM temp
     49  GROUP BY customer_id
     50  ORDER BY customer_id;
    
    CUSTOMER_ID FLAG
    ----------- ----
              1 n
              2 n
              3 n
             11 y
             22 y
    
    SQL>
    

    【讨论】:

      【解决方案3】:

      假设您的关系数据可能是稀疏的,例如:

      CREATE TABLE relationship ( customer_id, related_customer ) AS
      SELECT  2,  3 FROM DUAL UNION ALL
      SELECT  3,  1 FROM DUAL UNION ALL
      SELECT  3,  2 FROM DUAL UNION ALL
      SELECT 11, 22 FROM DUAL;
      
      CREATE TABLE "CHECK" ( customer_id, check_flag ) AS
      SELECT  1, 'y' FROM DUAL UNION ALL
      SELECT  2, 'y' FROM DUAL UNION ALL
      SELECT  3, 'n' FROM DUAL UNION ALL
      SELECT 11, 'y' FROM DUAL UNION ALL
      SELECT 22, 'y' FROM DUAL;
      

      (注意:以下查询也适用于您的密集数据,其中枚举了每个关系组合。)

      然后你可以使用分层查询:

      SELECT customer_id,
             MIN(check_flag) AS check_flag
      FROM   (
        SELECT CONNECT_BY_ROOT(c.customer_id) AS customer_id,
               c.check_flag AS check_flag
        FROM   "CHECK" c
               LEFT OUTER JOIN relationship r
               ON (r.customer_id = c.customer_id)
        WHERE  CONNECT_BY_ISLEAF = 1
        CONNECT BY NOCYCLE
               (  PRIOR r.related_customer = c.customer_id
               OR PRIOR c.customer_id = r.related_customer )
        AND    PRIOR c.check_flag = 'y'
      )
      GROUP BY
             customer_id
      ORDER BY
             customer_id
      

      哪些输出:

      CUSTOMER_ID CHECK_FLAG
      1 n
      2 n
      3 n
      11 y
      22 y

      db小提琴here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-23
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        相关资源
        最近更新 更多