簡體   English   中英

來自同一表的GROUP BY和LEFT JOIN以及COUNT個

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM