2012-03-02 9 views
0

次のクエリがあり、買い手、買い手、 ソース、総リード数、返されたリードの4つの列を生成しようとしています。サブクエリの追加

問題は、リードの総数が列に含まれていることです。返された値はデータベース内で値が0または1の列です。返される値はすべて1ですが、購入したリードについては0が必要です。次のクエリを実行すると、購入されたリードはすべて終了しますどのようにして希望の結果を得るためにサブクエリを修正できますか?

SELECT 
    ba.buyer, 
    l.source, 
    (SELECT COUNT(*) FROM lead_status WHERE lead_id = l.id AND returned != 1) AS 'Bought Leads', 
    SUM(l.returned) AS 'Returned_Leads' 
FROM lead_status AS ls 
    LEFT JOIN leads AS l ON ls.lead_id = l.id 
    LEFT JOIN buyer_account AS ba ON ba.lead_buyer_id = ls.lead_buyer_id 
WHERE l.origin = 'PING_POST' 
    AND ls.discriminator IN('AUTO_POST','HOME_POST','HEALTH_POST','LIFE_POST') 
    AND DATE(ls.create_date) BETWEEN '2012-02-01' AND '2012-02-31' 
    AND l.sold = 1 AND ls.winner = 1 AND l.test = 0 AND l.returned = 1 
GROUP BY ls.buyer, l.source; 

答えて

3

だけでサブクエリを置き換えます。そうでなければ、両方の和が(0の場合、その後、他の1 0エンドケースが返される)CASEなステートメントつまり合計で動作させる必要があり、限り、そのビットフィールドとして

SUM(1-l.returned) 

。私はそれが2進数の1または0だ場合は、代替手段としてこれを行うことができると思うだろう

+0

クリエイティブ、私は私よりもそれが好きです。より効率的です。 – JKomusin

+1

ビットフィールドでない場合は、減算のabs()を取って0と1の値を得ます – Sparky

1

返した場合

SUM(abs(l.returned-1)) 
  • を試してみては0を持っている、それは-1を返します
  • を返された場合は1を持っている、それは)(ABSを取っ0

を返します。値は+1になりますので、SUM()はうまくいくはずです

1

SELECT 
    ba.buyer, 
    l.source, 
    COUNT(l.returned) - SUM(l.returned) AS 'Bought Leads', 
    SUM(l.returned) AS 'Returned_Leads' 
FROM lead_status AS ls 
    LEFT JOIN leads AS l ON ls.lead_id = l.id 
    LEFT JOIN buyer_account AS ba ON ba.lead_buyer_id = ls.lead_buyer_id 
WHERE l.origin = 'PING_POST' 
    AND ls.discriminator IN('AUTO_POST','HOME_POST','HEALTH_POST','LIFE_POST') 
    AND DATE(ls.create_date) BETWEEN '2012-02-01' AND '2012-02-31' 
    AND l.sold = 1 AND ls.winner = 1 AND l.test = 0 AND l.returned = 1 
GROUP BY ls.buyer, l.source; 
関連する問題