按日期排序员工首次入职月度统计结果的SQL问题
解决SQL月度入职统计的排序问题
你的问题出在按字符串格式的date排序上——'04/2021'和'05/2020'作为字符串比较时,会先看前两位的月份,'04'比'05'小,所以排在前面,这不符合日期的逻辑顺序。
给你两种简单的修复方案:
方案1:按原始日期字段的聚合值排序
直接在ORDER BY里用分组内的最小日期(因为同一个date分组下的minStartDate都属于同一个年月,所以MIN(sub.minStartDate)就是该年月的代表日期):
SELECT TO_CHAR(sub.minStartDate,'mm/YYYY') as date, COUNT(DISTINCT sub.id) AS nombre FROM ( SELECT MIN(sw.start_date) as minStartDate, e.id FROM employee e INNER JOIN social_work sw ON e.id = sw.employee_id GROUP BY e.id HAVING MIN(sw.start_date) BETWEEN '2020-01-01' AND '2022-12-31' ) sub GROUP BY date ORDER BY MIN(sub.minStartDate)
方案2:将字符串日期转换为日期类型排序
把输出的date字符串转回日期类型,再按日期排序:
SELECT TO_CHAR(sub.minStartDate,'mm/YYYY') as date, COUNT(DISTINCT sub.id) AS nombre FROM ( SELECT MIN(sw.start_date) as minStartDate, e.id FROM employee e INNER JOIN social_work sw ON e.id = sw.employee_id GROUP BY e.id HAVING MIN(sw.start_date) BETWEEN '2020-01-01' AND '2022-12-31' ) sub GROUP BY date ORDER BY TO_DATE(date, 'mm/YYYY')
为什么之前的尝试出错?
你把sub.minStartDate加入GROUP BY后,会把同一个年月下的不同具体日期(比如4月1日和4月15日)分成不同分组,导致原本应该合并的统计被拆分,所以出现了重复的04/2021行,count值也不对。
内容的提问来源于stack exchange,提问作者yinyang
相关产品推荐
相关产品推荐

