2017-03-28 11 views
0

を引っ張っ:シンプルなグループによるSQLのために、私は、次の表を持って

Check | Email | Count 
Y  | a  | 1 
Y  | a  | 1 
Y  | b  | 1 
N  | c  | 1 
N  | d  | 1 

私が欲しいのグループにそれはチェック 'と各電子メールの下のカウント数によります。したがって、このように:

Check | Count # | Email Addresses 
Y  | 1 count | 1 (refers to email b) 
Y  | 2+ counts | 1 (refers to email a) 
N  | 1 count | 2 (refers to email c & d) 
N  | 2+ counts | 0 (no emails meet this condition) 

すべての「チェック」の値は、電子メール

答えて

0

これに固有のもので、最も容易ないの値を置くことによって行われます。

しかし、それは集約2つのレベルが必要です。

select check, sum(case when cnt = 1 then 1 else 0 end) as cnt_1, 
     sum(case when cnt >= 2 then 1 else 0 end) as cnt_2plus 
from (select check, email, count(*) as cnt 
     from t 
     group by check, email 
    ) ce 
group by check; 
0

これは動作するはずですが、しかしそこに着くためにクリーンな方法があるかもしれません。私はあなたが電子メールがnullであるソーステーブルにレコードがあると仮定して、電子メールが条件を満たしていない場合を拾うために、追加の集約レイヤーが必要だと思います。ソーステーブルにこれらのケースのレコードがない場合、これは機能しません。

select check 
     ,count_num 
     ,case when email_addresses is null then 0 else email_addresses end as email_addresses 
from (
select check, 
     case when count_sum = 1 then 1 when count_sum > 1 then 2+ else 0 end as count_num, 
     count(distinct(email)) as email_addresses 
group by check, count_num 
from (
select check, sum(count) as count_sum, email 
from table 
group by check, email 
) 
) 
関連する問題