2012-12-11 2 views
0

У меня есть запрос, который возвращает информацию аналитики стиля о работе совете и где кандидаты приходят из в следующей структуре:Объединение нескольких записей на правой стороне присоединиться к 1 записи на левой стороне

Data format for query

запрос на доступ к этому есть:

SELECT g.name AS [Source] 
     ,SUM(CASE WHEN v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Clicks] 
     ,SUM(CASE WHEN v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Clicks] 
     ,COUNT(v.id) AS [Total Clicks] 
     ,SUM(CASE WHEN a.applicant = 1 AND v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Applicants] 
     ,SUM(CASE WHEN a.applicant = 1 AND v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Applicants] 
     ,SUM(CASE WHEN a.applicant = 1 THEN 1 ELSE 0 END) AS [Total Applicants] 
     ,SUM(v.cost/100.0) AS [Spend] 
FROM a_views v 
LEFT OUTER JOIN a_views a 
    ON v.viewerid = a.viewerid 
    AND v.sessionsourceid = a.sessionsourceid 
    AND a.applicant = 1 
JOIN a_sources s 
    ON v.sourceid = s.id 
JOIN a_sourcegroups g ON s.fk_sourcegroup = g.id 
--JOIN jobs j ON v.jobid = j.anal_id AND j.featured = 1 
WHERE v.hostName = @jobboard 
    AND v.viewed_at >= @start AND v.viewed_at <= @end 
GROUP BY g.name 

Единственная проблема в том, что в LEFT OUTER JOIN a_views блоке может быть несколько записей возвращается. То, что мне нужно сделать, - это только запись, отслеживаемая один раз в суммах Click, но каждый раз, когда она найдена для сумм Applicant.

Я нашел аналогичный вопрос об этом на this question, но ответчик фактически не дал много информации.

Чтобы возобновить то, что мне нужно, каждый экземпляр записи в правой части соединения, но только 1 экземпляр записи с левой стороны.

+1

Используйте функцию 'Group By' и агрегированные функции для повторных данных. – Jodrell

ответ

0

Один из способов, которым вы могли бы это сделать без изменения вашего запроса, - это разделить суммы Click и суммы претендентов на два отдельных запроса: UNION их вместе, а затем снова группировать/суммировать их.

Что-то вроде этого (псевдо-код):

SELECT 
     Source 
     ,SUM([Organic Clicks]) 
     ,..... 
FROM 
(
SELECT g.name AS [Source] 
     ,SUM(CASE WHEN v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Clicks] 
     ,SUM(CASE WHEN v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Clicks] 
     ,COUNT(v.id) AS [Total Clicks] 
     ,0 AS [Organic Applicants] 
     ,0 AS [Paid Applicants] 
     ,0 AS [Total Applicants] 
     ,SUM(v.cost/100.0) AS [Spend] 
FROM 
     ClickOnlyTables 

UNION ALL 

SELECT g.name AS [Source] 
     ,0 AS [Organic Clicks] 
     ,0 AS [Paid Clicks] 
     ,0 AS [Total Clicks] 
     ,SUM(CASE WHEN a.applicant = 1 AND v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Applicants] 
     ,SUM(CASE WHEN a.applicant = 1 AND v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Applicants] 
     ,SUM(CASE WHEN a.applicant = 1 THEN 1 ELSE 0 END) AS [Total Applicants] 
     ,0 AS [Spend] 
FROM 
     ApplicantTables 
) 
GROUP BY 
     Source 
0

По какой-то причине, я не думаю, что вы хотите автообъединение, чтобы ответить на этот вопрос. Возможно, только агрегирование a_views однажды решает проблему, сначала заявителем, а затем игрой.

Я считаю, что трудно определить, что вы собираетесь с вашего запроса, но что-то вроде этого, как первый агрегирования:

select g.name, valuationDups.viweerid, v.sessionsourceid, 
     SUM(CASE WHEN v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Clicks], 
     SUM(CASE WHEN v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Clicks], 
     COUNT(v.id) AS [Total Clicks], 
     SUM(CASE WHEN a.applicant = 1 AND v.cost = 0 THEN 1 ELSE 0 END) AS [Organic Applicants], 
     SUM(CASE WHEN a.applicant = 1 AND v.cost <> 0 THEN 1 ELSE 0 END) AS [Paid Applicants], 
     SUM(CASE WHEN a.applicant = 1 THEN 1 ELSE 0 END) AS [Total Applicants], 
     SUM(v.cost/100.0) AS [Spend]  
FROM a_views v JOIN 
    a_sources s 
    ON v.sourceid = s.id JOIN 
    a_sourcegroups g 
    ON s.fk_sourcegroup = g.id 
WHERE v.hostName = @jobboard and 
     v.viewed_at >= @start AND 
     v.viewed_at <= @end 
group by g.name, valuationDups.viweerid, v.sessionsourceid 

А потом снова агрегировать по g.name.

+0

Я должен был сказать в своем вопросе, что причина, по которой мне нужно присоединение к себе, состоит в том, что 1 запись будет содержать стоимость, а затем у другого будет поле бит-заявителя. –

+0

@DaveLong. , , вы можете объединить их вместе, используя агрегацию. Я не знаю вашей логики, но 'max (претендент)' и 'sum (cost)' кажутся полезными для этой цели. –

+0

Не могли бы вы показать мне пример того, о чем вы говорите? –

Смежные вопросы