我在表格中有几年的数据(查询)。每个条目都有一个contact_time字段,该字段是其电子邮件联系人的时间戳。我正在尝试构建月度或每周摘要数据,以便在多系列图表上进行绘图。为此,我需要在第一列中查看第二列中的月份或周数,以及第二列中的2014年和2015年第三列中的相应数据等。
SELECT MONTH(inquiries.contact_time) AS "Date",
(SELECT
COUNT(inquiries.id) AS "Inquiries"
FROM inquiries
WHERE YEAR(inquiries.contact_time) = "2014"
) AS "2014",
(SELECT COUNT(inquiries.id) AS "Inquiries"
FROM inquiries
WHERE YEAR(inquiries.contact_time) = "2015"
) AS "2015"
FROM inquiries
GROUP BY MONTH(inquiries.contact_time)
我所看到的是所有行中每年的总数。任何帮助表示赞赏。
答案 0 :(得分:2)
使用条件聚合:
SELECT MONTH(i.contact_time),
SUM(YEAR(i.contact_time) = 2014) as cnt_2014,
SUM(YEAR(i.contact_time) = 2015) as cnt_2015
FROM inquiries i
WHERE YEAR(i.contact_time) >= 2014
GROUP BY MONTH(i.contact_time);
如果您在contact_time
上有索引,请使用条件where i.contact_time >= '2014-01-01'
,以便它可以利用索引。
答案 1 :(得分:1)
您查看了当年的总计数,因为您的子查询与外部查询的分组的月份无关。
我会用这种方式编写查询:
SELECT MONTH(contact_time) AS `Date`,
SUM(YEAR(contact_time)=2014) AS `2014`,
SUM(YEAR(contact_time)=2015) AS `2015`
FROM inquiries
GROUP BY MONTH(contact_time)
说明:特定行集的COUNT()与这些行的1()的SUM()相同。并且MySQL布尔表达式返回 true 的整数1。