2017-06-27 5 views
1

Ich versuche, Kunden zu zählen, die über verschiedene Kanäle erreichbar sind. Der folgende Code gibt mir eine einzige Zählung nur der Kunden, die per SMS erreichbar sind.SQL: Spalte Spalte x wenn Spalte y = z

with grouping as (
select distinct       
case when sms_correct_flag = 'Y' then 'Y' else 'N' end as smsable,      
case when email_correct_flag = 'Y' then 'Y' else 'N' end as emailable,     
case when address_correct_flag = 'Y' then 'Y' else 'N' end as dmable,   
contact_key      
from raw.contacts     
) 

select count(distinct contact_key) 
from grouping 
where smsable = 'Y'; 

Ich mag mit einem Tisch, gefüllt mit ‚Kanal‘ als eine Spalte, ‚E-Mail‘, ‚SMS‘, ‚DM‘, wie Zeilen und ihren jeweiligen Kunden zählen am Ende.

Dies kann eine Zählung sein (Fall, wenn ....), kann aber nicht herausfinden, wie das funktioniert, wenn wir den Fall für eine Spalte überprüfen, die nicht mit der Spalte übereinstimmt, die wir zählen.

Jede Hilfe ist willkommen!

+0

Bearbeiten Sie Ihre Frage und geben Sie Beispieldaten und gewünschte Ergebnisse an. –

+0

Ich vermute, du bist eine Lösung, die etwas im Sinne von HAVING im Gegensatz zu WHERE ist. –

Antwort

1

Ist das wonach Sie suchen?

select channel,       
     sum(case when sms_correct_flag = 'Y' then 1 else 0 end) as smsable,      
     sum(case when email_correct_flag = 'Y' then 1 else 0 end) as emailable,     
     sum(case when address_correct_flag = 'Y' then 1 else 0 end) as dmable   
from raw.contacts 
group by channel; 
+0

Ich denke, "Kanal" ist ein "synthetisches" Feld, das OP produzieren möchte. Ich denke, er sucht nach einem Drehpunkt, aber ich habe keine Ahnung, ob Rotverschiebung eine Möglichkeit bietet. – dasblinkenlight

2

Da Sie nur drei Kanäle haben, können Sie UNION ALL verwenden, um die Ergebnisse zu produzieren, die Sie benötigen:

with grouping as (
    select 
     MAX(case when sms_correct_flag = 'Y' then 1 else 0 end) as smsable 
    , MAX(case when email_correct_flag = 'Y' then 1 else 0 end) as emailable 
    , MAX(case when address_correct_flag = 'Y' then 1 else 0 end) as dmable 
    , contact_key 
    from raw.contacts 
    group by contact_key 
) 
select 'sms' as channel, SUM(smsable) as cust_count from grouping 
union all 
select 'email' as channel, SUM(emailable) as cust_count from grouping 
union all 
select 'dm' as channel, SUM(dmable) as cust_count from grouping 

Hinweis: Ich weiß nicht, ob Amazon Rotverschiebung Dreheinrichtungen in gebaut . Wenn dies der Fall ist, haben Sie möglicherweise einen besseren Ansatz als die Pivot-Implementierung dieses armen Mannes.

Verwandte Themen