Home > Mobile >  MySQL group records by month does not show records as expected
MySQL group records by month does not show records as expected

Time:04-27

I have written the following query but it does not group the records by month. Some of the records are displayed without order. I am unable to get the reason behind it.

select MONTHNAME(CREATE_TIME) AS MONTH,FEATURE as     
featureName,count(DISTINCT(FEATURE)) as featureCount, app_name as appName
from ceye.approve
where
    create_time >now() - INTERVAL 12 MONTH
 AND
 review_time is NULL

group by MONTH,FEATURE,appName

ORDER BY MONTH desc ;

The data displayed by it is as follows:
enter image description here

Here is the data in image for reference

October,Replace PAN Card,1,Retail Bank Portal    
October,S3,1,Retail Bank Portal    
October,View Account Summary,1,Retail Bank Portal    
November,login,1,Retail Bank Portal    
November,Replace PAN Card,1,Retail Bank Portal    
March,login,1,Retail Bank Portal    
March,update profile,1,Retail Bank Portal    
January,FI unfreeze PAN Card,1,Retail Bank Portal    
January,login,1,Retail Bank Portal    
January,Replace PAN Card,1,Retail Bank Portal    
December,login,1,Retail Bank Portal    
December,Replace PAN Card,1,Retail Bank Portal      
December,update profile,1,Retail Bank Portal    
December,update user profile api,1,Retail Bank Portal     
April,login,1,Mobile Banking    
April,login,1,Retail Bank Portal    
April,update profile,1,Markets Research Portal    
April,update profile,1,Retail Bank Portal    

CodePudding user response:

When you would like to sort by the months according to their order in the calender, you have to order by their number. You can achieve this by using MONTH. In this way, you can get the month number for the given dates and do the sort:

ORDER BY MONTH(creation_time) DESC

Here is an example that shows it's working fine: db<>fiddle

CodePudding user response:

Research order by case as an example -

DROP TABLE IF EXISTS T;

CREATE TABLE T(DT date, val int);

INSERT INTO T VALUES
('2022-01-01',10),
('2022-02-01',10),('2022-02-01',10),
('2022-03-01',10),('2022-03-01',10),('2022-03-01',10),
('2022-05-01',10),('2022-05-01',10),('2022-05-01',10),('2022-05-01',10),('2022-05-01',10);

select monthname(dt),sum(val)
from t
group by monthname(dt)
order by
case when monthname(dt) = 'December' then 1
      when monthname(dt) = 'November' then 2
      when monthname(dt) = 'October'  then 3
      when monthname(dt) = 'September' then 4
      when monthname(dt) = 'August'   then 5
      when monthname(dt) = 'July'     then 6
      when monthname(dt) = 'June'     then 7
      when monthname(dt) = 'May'      then 8
      when monthname(dt) = 'April'    then 9
      when monthname(dt) = 'March'    then 10
      when monthname(dt) = 'February' then 11
      when monthname(dt) = 'January'  then 12
end
;

 --------------- ---------- 
| monthname(dt) | sum(val) |
 --------------- ---------- 
| May           |       50 |
| March         |       30 |
| February      |       20 |
| January       |       10 |
 --------------- ---------- 
4 rows in set (0.002 sec)
  • Related