[英]Group and count data based on a calculated field in mysql?
我在mysql中有2个表,记录某个事件发生的日期。
Table1是主表,我只写session_id(在这种情况下,日期是从Table2的匹配记录中提取的)或日期。 我没有填写的字段保持为NULL。
现在,我想计算该事件每月/每年发生了多少次,并且,如果可能的话,请仅在特定日期(例如2013年1月1日)之后执行该过程。
到目前为止,这是我所做的事情,我创建了另一个日期字段(称为date_final),该日期字段每行包含非NULL值,因此我试图根据该字段对数据进行分组。
SELECT table1.date AS date1,
table2.session_date AS date2,
@date_final := CONCAT_WS('', table1.date, table2.session_date) AS date_final,
MONTHNAME(@date_final) AS `month`,
YEAR(@date_final) AS `year`
FROM table1
LEFT JOIN table2 ON table2.id = table1.session_id
GROUP BY YEAR(@date_final), MONTH(@date_final)
显然,这种方法效果不佳,因此我在这里。 MySQL每月/每年只向我返回一些值,这不好。 当我添加COUNT(*)子句时,情况甚至更糟。 我只是mysql的新手,我想我在这里进入深水:P
##Sample data for Table1##
#id session_id date#
1 1 NULL
2 NULL 2013-01-04
3 2 NULL
4 NULL 2013-01-20
5 NULL 2013-02-22
6 3 NULL
##Sample data for Table2##
#id session_date#
1 2013-01-02
2 2013-01-10
3 2013-03-02
预期成绩? 就像是:
2013 January 3
2013 February 2
2013 March 1
一种可能是您打算:
SELECT table1.date AS date1,
table2.session_date AS date2,
coalesce(table1.date, table2.session_date) AS date_final,
MONTHNAME(coalesce(table1.date, table2.session_date)) AS `month`,
YEAR(coalesce(table1.date, table2.session_date)) AS `year`
FROM table1 LEFT JOIN
table2
ON table2.id = table1.session_id
GROUP BY MONTHNAME(coalesce(table1.date, table2.session_date)),
YEAR(coalesce(table1.date, table2.session_date))
order by `month`, `year`;
为此,您不需要会话变量。
因为可靠地使用它们的规则并不简单,所以删除会话变量,您似乎正在寻找的是带有COALESCE
的LEFT JOIN
,类似;
SELECT
YEAR(COALESCE(table1.date, table2.session_date)) year,
MONTHNAME(COALESCE(table1.date, table2.session_date)) month,
COUNT(*) cnt
FROM table1
LEFT JOIN table2 ON table1.session_id = table2.id
GROUP BY year, month
ORDER BY year, MONTH(COALESCE(table1.date, table2.session_date))
请注意,这里的table1.date
优先于table2.session_date
,如果您希望以另一种方式,则必须将COALESCE
的顺序颠倒。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.