문제

쿼리에서 세 개의 테이블 (날짜, 리드 및 클릭)을 결합하고 싶습니다.

테이블은 다음과 같습니다.

데이트:

|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을 제공합니다. 코드를 이동하고 리드 테이블에서 선택을 넣으면 모든 클릭에 리드 오른쪽 봇 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에서는 리드 커미션에 대해 예상 700 대신 1400을 반환합니다.

그래서 노조에서 나는 카운트에 문제가 있고 왼쪽 가입에서는 작동하지 않는 합이 있습니다.

가능하면 정말로 노동 조합을 고수하고 싶지만 두 가지를 모두 얻을 수있는 방법을 찾지 못했습니다.

(이것은 후속 조치입니다 이것 이전 질문이지만 새로운 질문을 게시했다는 점에서 수를 묻지 않았기 때문에.)

도움이 되었습니까?

해결책

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top