الاتحاد مع العد أو الانضمام مع sum - mysql
سؤال
أريد أن أجمع بين ثلاث طاولات - تاريخ، الرصاص والنقر - في استعلام.
تبدو الجداول مثل هذا:
تاريخ:
|date|
قيادة:
id|time|commission
انقر:
id|time|commission
تاريخ الجدول هو مجرد تخزين التواريخ ويستخدم عند الحصول على التواريخ بدون نقرة أو الرصاص.
لذلك إذا كان لدينا البيانات التالية في الجداول:
تاريخ:
2009-06-01
2009-06-02
2009-06-03
قيادة:
1|2009-06-01|400
2|2009-06-01|300
3|2009-06-03|350
انقر:
1|2009-06-01|1
2|2009-06-03|2
3|2009-06-03|2
4|2009-06-03|0
أرغب في الحصول على تاريخ، عدد النقر، لجنة النقرات النقرات (هناك نقرات لا تعطي عمولة)، عدد العملاء المتوقعين، اللجنة الناتجة عن قيادتها ورسم إجمالي. لذلك مع الجداول أعلاه أود الحصول عليها:
2009-06-01|1|1|2|700|701|
2009-06-02|0|0|0|0|0
2009-06-03|3|4|1|350|354|
لقد حاولت مع الاتحاد التالي:
SELECT
campaign_id,
commission_date,
SUM( click_commission ) AS click_commission,
click,
SUM( lead_commission ) AS lead_commission ,
lead,
SUM( total_commission ) as total_commission
FROM(
SELECT
click.campaign_id AS campaign_id,
DATE( click.time ) AS commission_date,
click.commission AS click_commission,
(SELECT count(click.id) from click GROUP BY date(click.time)) as click,
0 as lead_commission,
0 as lead,
click.commission AS total_commission
FROM click
UNION ALL
SELECT
lead.campaign_id AS campaign_id,
DATE( lead.time ) AS commission_date,
0 as click_commission,
0 as click,
lead.commission AS lead_commission,
lead.id as lead,
lead.commission AS total_commission
FROM lead
UNION ALL
SELECT
0 AS campaign_id,
date.date AS commission_date,
0 AS click_commission,
0 as click,
0 AS lead_commission,
0 as lead,
0 AS total_commission
FROM date
) AS foo
WHERE commission_date BETWEEN '2009-06-01' AND '2009-07-25'
GROUP BY commission_date
ORDER BY commission_date LIMIT 0, 10
ولكن هذا لا يعمل على حساب عدد النقرات ويؤدي التعليمات البرمجية أعلاه يمنح الكود المبلغ الصحيح من النقرات بوت 0 على جميع العملاء المتوقعين. إذا قمت بنقل الرمز حوله ووضعه من جدول الرصاص، أحصل على Lefines Right Bot 0 على جميع النقرات. لم أتمكن من إيجاد طريقة للحصول على كل من التهم من الاستعلام.
لذلك حاولت الانضمام اليسرى بدلا من ذلك:
SELECT
date.date as date,
count( DISTINCT click.id ) AS clicks,
sum(click.commission) AS click_commission,
count( lead.id ) AS leads,
sum(lead.commission) AS lead_commission
FROM date
LEFT JOIN click ON ( date.date = date( click.time ) )
LEFT JOIN lead ON ( date.date = date( lead.time ) )
GROUP BY date.date
LIMIT 0 , 30
المشكلة في هذا الاستعلام هو إذا كان هناك أكثر من نقرات أو يؤدي في تاريخ، وسوف ترجع القيمة المتوقعة * 2. لذلك في 2009-06-01 سيعود 1400 بدلا من ذلك بدلا من 700 من المتوقع للجنة الرصاص.
أود حقا التمسك بالاتحاد إن أمكن، لكنني لم أجد وسيلة للحصول على كلا الطرفين.
(هذه متابعة هذه سؤال سابق، ولكن منذ أن لم أطلب العد في ذلك نشرت سؤالا جديدا.)
المحلول
SELECT date,
COALESCE(lcomm, 0), COALESCE(lcnt, 0),
COALESCE(ccomm, 0), COALESCE(ccnt, 0),
COALESCE(ccomm, 0) + COALESCE(lcomm, 0),
COALESCE(ccnt, 0) + COALESCE(lcnt, 0)
LEFT JOIN
(
SELECT date, SUM(commission) AS lcomm, COUNT(*) AS lcnt
FROM leads
GROUP BY
date
) l
ON l.date = d.date
LEFT JOIN
(
SELECT date, SUM(commission) AS ccomm, COUNT(*) AS ccnt
FROM clicks
GROUP BY
date
) с
ON c.date = d.date
FROM date d
نصائح أخرى
الرمز الذي استخدمته، بنيت من الاقتراح من Quassnoi:
SELECT date,
COALESCE(ccomm, 0) AS click_commission, COALESCE(ccnt, 0) AS click_count,
COALESCE(lcomm, 0) AS lead_commision, COALESCE(lcnt, 0) AS lead_count,
COALESCE(ccomm, 0) + COALESCE(lcomm, 0) as total_commission
FROM date d
LEFT JOIN
(
SELECT DATE(time) AS lead_date, SUM(commission) AS lcomm, COUNT(*) AS lcnt
FROM lead
GROUP BY
lead_date
) l
ON lead_date = date
LEFT JOIN
(
SELECT DATE(time) AS click_date, SUM(commission) AS ccomm, COUNT(*) AS ccnt
FROM click
GROUP BY
click_date
) с
ON click_date = date