【问题标题】:How to get count of a column value returned using subquery?如何获取使用子查询返回的列值的计数?
【发布时间】:2014-08-31 00:29:23
【问题描述】:

我想获取 STAGING_CUST_ACCT 表的 acct_key 列中不存在的所有 hrc_acct_num。最后一个外部选择列抛出错误。如何获取使用子查询返回的列的计数?

SELECT source_sys_cd, 
       Count(CASE 
               WHEN is_delete = 0 THEN 1 
             END) [DEL IS 0], 
       Sum(CASE 
             WHEN trans_amt = 0 THEN 1 
             ELSE 0 
           END)   [STG $0 TXN CNT], 
       Count(CASE 
               WHEN hrc_acct_num NOT IN(SELECT DISTINCT acct_key 
                                        FROM   staging_cust_acct) THEN 
               hrc_acct_num 
             END) 
FROM   staging_transactions (nolock) 
GROUP  BY source_sys_cd 
ORDER  BY source_sys_cd  

【问题讨论】:

    标签: sql sql-server count subquery aggregate-functions


    【解决方案1】:

    您可以对子查询执行 LEFT JOIN,然后在值为 null 时执行 SUM。 acct_key

    SELECT source_sys_cd, 
           Count(CASE 
                   WHEN is_delete = 0 THEN 1 
                 END) [DEL IS 0], 
           Sum(CASE 
                 WHEN trans_amt = 0 THEN 1 
                 ELSE 0 
               END)   [STG $0 TXN CNT], 
           SUM(CASE WHEN T.acct_key is NULL THEN 1 else 0  END ) CountNotIN
    
    FROM   staging_transactions (nolock) s
           LEFT JOIN (SELECT DISTINCT acct_key 
                                            FROM   staging_cust_acct) t 
            s.hrc_acct_num  = t.acct_key 
    GROUP  BY source_sys_cd 
    ORDER  BY source_sys_cd  
    

    Here's a simplified demo

    【讨论】:

    • Sum 在这种情况下也可以工作,但是,count() 不会在 null 值上递增,在这种情况下,如果条件不成立,它将从 case 语句中返回。
    • @JaazCole 你是对的。出于某种原因,我在那里阅读了else 0。个人I still prefer SUM(CASE over COUNT(CASE
    【解决方案2】:

    您可以使用NOT EXISTS 短路子查询。它比LEFT JOIN (SELECT DISTINCT 更有效,因为您不必关心枚举它确实存在的所有时间。

       SELECT source_sys_cd, 
               Count(CASE is_delete WHEN 
                       WHEN is_delete = 0 THEN 1 
                     END) [DEL IS 0], 
               Count(CASE 
                       WHEN trans_amt = 0 THEN 1 
                     END) [STG $0 TXN CNT], 
               Count(CASE 
                       WHEN NOT EXISTS (SELECT 1
                                        FROM staging_cust_acct
                                        WHERE acct_key = hrc_acct_num) THEN 1
                     END) 
        FROM   staging_transactions (nolock)
        GROUP  BY source_sys_cd 
        ORDER  BY source_sys_cd  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2013-09-22
      • 2017-03-11
      相关资源
      最近更新 更多