группировать по месяцам и годам, считать из другой таблицы - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь получить свой запрос, чтобы сгруппировать строки по месяцам и годам из таблицы 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)

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

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 - это переменная, содержащая идентификатор дилерского центра, в котором я пытаюсь просмотреть счет.

любая помощь будетс благодарностью.

Ответы [ 3 ]

1 голос
/ 14 марта 2012

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

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 голосов
/ 14 марта 2012

Начните с

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, возможно, мы сможем вам помочь в дальнейшем.

0 голосов
/ 14 марта 2012

Это должно сработать:

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 () игнорирует значения NULL. Если вы хотите посчитать и их (что я не могу себе представить) напишите так:

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
...