2014-07-09 19 views
0

我想獲取所有的不存在於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 

回答

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

+1

總結也會在這種情況下工作,但是,count()不會在空值上遞增,如果條件不正確,將從case語句返回,在這種情況下。 –

+0

哇,非常感謝! –

+0

@JaazCole你是對的。出於某種原因,我在那裏讀了一個「else 0」。個人[我仍然喜歡SUM(CASE超過COUNT(CASE)(http://stackoverflow.com/questions/6350154/selecting-count-from-different-criteria-on-a-table/6350268#comment7431588_6350268) –

1

您可以短路與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 
相關問題