且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

按月和按年,从另一个表

更新时间:2023-01-29 22:17:29

您可以将时间戳截短到几个月,分组,然后从中导出必要的日期部分:

You can sort of truncate your timestamps to months and use the obtained values for grouping, then derive the necessary date parts from them:

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()不会真正截断时间戳,但会将属于同一月份的所有值转换为相同的值,这基本上是我们需要。

Well, LAST_DAY() doesn't really truncate a timestamp, but it does turn all the values belonging to the same month into the same value, which is basically what we need.

我想计数应该与你实际选择的行相关,这不是你的子查询。这样可能会:

And I guess the counts should be related to the rows you are actually selecting, which is not what your subqueries are. Something like this might do:

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

这里是包含所有修改的整个查询:

Here's the entire query with all the modifications mentioned:

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