[英]GROUP BY and LEFT JOIN with COUNT from same table
要根据年份,类型和订单按月计数
这是我的user table
:
id type uname date_created
1 fac a 2015-12-28 17:11:19
2 cs b 2015-12-23 19:09:51
3 cs c 2015-12-23 19:09:21
4 stu d 2015-12-31 18:12:41
5 fac e 2015-11-11 00:00:00
6 fac f 2015-10-07 00:00:00
预期结果:
fac stu cs
1 1 2 // month january
1 0 0 // month octomber
1 0 0 // month november
我试过的是:
SELECT count(u1.id) as fac, count(u2.id) as stu, count(u3.id) as cs
FROM user u
left join user u1 ON u1.faculty = 'yes' AND YEAR(u1.date_created) = 2015
left join user u2 ON u2.faculty = 'no' AND YEAR(u2.date_created) = 2015
left join user u3 ON u3.faculty = 'club_student' AND YEAR(u3.date_created) = 2015
GROUP BY MONTH(u.date_created) ORDER BY MONTH(u.date_created)
给我错误的结果,例如:
fac stu cs
6 6 6
6 6 6
24 24 24
您需要一个PIVOT
命令将行转置为列。 实际上,MySQL不支持这种操作,因此我们需要使用CASE WHEN
手动进行操作(请参见SQLFiddle ):
select
month(date_created) as month,
count(case when faculty = 'yes' THEN 1 END) as fac,
count(case when faculty = 'no' THEN 1 END) as stu,
count(case when faculty = 'club_student' THEN 1 END) as cs
from user
where 1=1
and date_created >= STR_TO_DATE('01-01-2015','%d-%m-%Y')
and date_created < STR_TO_DATE('01-01-2016','%d-%m-%Y')
group by month(date_created)
order by month(date_created)
实际上,您的联接语法没有意义...您需要进行三次联接以计算每个表中的id ...截至左联接时,只要存在联接匹配项,这些表中的数据就会返回,在不匹配的情况下返回null ...在COUNT
聚合函数中不计算null值,因此您的联接语法可以简化为INNER
联接语法。 但是,您甚至不需要INNER
FROM
,因为您正在FROM
相同的表,并且实际上您并不将FROM
表中的任何列与JOIN
表相关联。
这样,您定义的过滤器可以简化为WHERE
过滤器和CASE WHEN
过滤器(如我所建议的)。
试试count(distinct)
:
SELECT count(distinct u1.id) as fac, count(distinct u2.id) as stu,
count(distinct u3.id) as cs
FROM user u left join
user u1
ON u1.faculty = 'yes' AND YEAR(u1.date_created) = 2015 left join
user u2
ON u2.faculty = 'no' AND YEAR(u2.date_created) = 2015 left join
user u3
ON u3.faculty = 'club_student' AND YEAR(u3.date_created) = 2015
GROUP BY MONTH(u.date_created) ORDER BY MONTH(u.date_created)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.