2012-03-14 3 views
0

im пытается получить мой запрос для группировки строк по месяцам и годам из таблицы assignments и подсчета количества строк, имеющих определенное значение из таблицы leads. они связаны друг с другом, так как таблица assignments имеет поле id_lead, которое является id строки в таблице leads.группа по месяцам и годам, подсчет из другой таблицы

d_new будет подсчетом заданий для потенциальных клиентов в течение месяца, чей сайт newsite.com d_subprime будет подсчетом заданий для потенциальных клиентов в течение месяца, чей сайт не newsite.com

здесь таблицы используются:

`leads` 
id (int) 
website (varchar) 

`assignments` 
id_lead (int) 
date_assigned (int) 

Heres мой запрос, который не работает:

SELECT 
    MONTHNAME(FROM_UNIXTIME(a.date_assigned)) as d_month, 
    YEAR(FROM_UNIXTIME(a.date_assigned)) as d_year, 
    (select COUNT(*) from leads where website='newsite.com') as d_new, 
    (select COUNT(*) from leads where website!='newsite.com') as d_subprime 
FROM assignments as a 
left join leads as l on (l.id = a.id_lead) 
where id_dealership='$id_dealership2' 
GROUP BY 
    d_month, 
    d_year 
ORDER BY 
    d_year asc, 
    MONTH(FROM_UNIXTIME(a.date_assigned)) asc 

$id_dealership - это переменная, содержащая идентификатор представительства, пытающегося просмотреть счетчик.

всякая помощь была бы принята с благодарностью.

ответ

1

Вы можете сортировать укоротить ваши временные метки месяцев и использовать полученные значения для группировки, а затем получить необходимые даты части из них:

SELECT 
    YEAR(d_yearmonth) AS d_year, 
    MONTHNAME(d_yearmonth) AS d_month, 
    … 
FROM (
    SELECT 
    LAST_DAY(FROM_UNIXTIME(a.date_assigned)) as d_yearmonth, 
    … 
    FROM assignments AS a 
    LEFT JOIN leads AS l ON (l.id = a.id_lead) 
    WHERE id_dealership = '$id_dealership2' 
    GROUP BY 
    d_yearmonth 
) AS s 
ORDER BY 
    d_year   ASC, 
    MONTH(d_yearmonth) ASC 

Ну, LAST_DAY() не очень укоротить метку времени, но превращает все значения, принадлежащие одному и тому же месяцу, в одно и то же значение, что в основном является тем, что нам нужно.

И я думаю, что подсчеты должны быть связаны с строками, которые вы фактически выбираете, а это не то, что ваши подзапросы. Нечто подобное может сделать:

… 
COUNT(d.website = 'newsite.com' OR NULL) AS d_new, 
/* or: COUNT(d.website) - COUNT(NULLIF(d.website, 'newsite.com')) AS d_new */ 
COUNT(NULLIF(d.website, 'newsite.com')) AS d_subprime 
… 

Вот весь запрос со всеми изменениями упомянутых:

SELECT 
    YEAR(d_yearmonth) AS d_year, 
    MONTHNAME(d_yearmonth) AS d_month, 
    d_new, 
    d_subprime 
FROM (
    SELECT 
    LAST_DAY(FROM_UNIXTIME(a.date_assigned)) as d_yearmonth, 
    COUNT(d.website = 'newsite.com' OR NULL) AS d_new, 
    COUNT(NULLIF(d.website, 'newsite.com')) AS d_subprime 
    FROM assignments AS a 
    LEFT JOIN leads AS l ON (l.id = a.id_lead) 
    WHERE id_dealership = '$id_dealership2' 
    GROUP BY 
    d_yearmonth 
) AS s 
ORDER BY 
    d_year   ASC, 
    MONTH(d_yearmonth) ASC 
+0

это фантастика. спасибо за объяснение, как хорошо! – scarhand

0

Это должно сделать трюк:

SELECT 
YEAR(FROM_UNIXTIME(a.date_assigned)) as d_year, 
MONTHNAME(FROM_UNIXTIME(a.date_assigned)) as d_month, 
l.website, 
COUNT(*) 
FROM 
assignments AS a 
INNER JOIN leads AS l on (l.id = a.id_lead) /*are you sure, that you need a LEFT JOIN?*/ 
WHERE id_dealership='$id_dealership2' 
GROUP BY 
d_year, d_month, website 
/*an ORDER BY is not necessary, MySQL does that automatically when grouping*/ 

Если вам действительно нужен LEFT JOIN, быть в курсе, что COUNT() игнорирует пустые значения. нет Если вы хотите считать эти, а также (что я не могу себе представить, чтобы иметь смысл) написать это:

SELECT 
YEAR(FROM_UNIXTIME(a.date_assigned)) as d_year, 
MONTHNAME(FROM_UNIXTIME(a.date_assigned)) as d_month, 
l.website, 
COUNT(COALESCE(l.id, 1)) 
FROM 
assignments AS a 
LEFT JOIN leads AS l on (l.id = a.id_lead) 
WHERE id_dealership='$id_dealership2' 
GROUP BY 
d_year, d_month, website 
0

Начать с

SELECT 
    MONTHNAME(FROM_UNIXTIME(a.date_assigned)) as d_month, 
    YEAR(FROM_UNIXTIME(a.date_assigned)) as d_year, 
    SUM(IF(l.website='newsite.com',1,0) AS d_new, 
    SUM(IF(l.website IS NOT NULL AND l.website!='newsite.com',1,0) AS d_subprime 
FROM assignments AS a 
LEFT JOIN leads AS l ON l.id = a.id_lead 
WHERE id_dealership='$id_dealership2' 
GROUP BY 
    d_month, 
    d_year 
ORDER BY 
    d_year asc, 
    MONTH(FROM_UNIXTIME(a.date_assigned)) asc 

и работы здесь: Поле id_dealership не является ни в leads и в assignments, поэтому вам нужно больше работы.

Если вы отредактируете свой вопрос на номер id_dealership, мы сможем вам помочь.

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