Sql Postgres中当月的总和

Sql Postgres中当月的总和,sql,postgresql,group-by,Sql,Postgresql,Group By,我尝试对同一个月的值求和,但结果是日期和值分开的行 我的代码是 select case extract(month from date(m.data)) when extract(month from current_date) then 'Current Month' else to_char(m.data, 'TMMonth/YYYY') end as "Date", sum(m.valor) as "Result" from movime

我尝试对同一个月的值求和,但结果是日期和值分开的行

我的代码是

 select 
    case extract(month from date(m.data)) 
    when extract(month from current_date) then 'Current Month' 
    else to_char(m.data, 'TMMonth/YYYY') end as "Date", 
    sum(m.valor) as "Result" 
    from movimentacao m 
    group by m.data 
    order by m.data;
我的结果是

Apr/2015      | 150.75
Apr/2015      | 15.00
Current Month | 10.00
Current Month | 2.34
我需要的是按月对这些值进行分组以求和,但是当我尝试按月分组时,sql get错误,因为我使用的是m.data in函数,并且我需要根据m.data进行分组。

您不应该根据m.data进行分组,而应该根据从中提取的月份进行分组。然后,您将遇到分组问题,唯一的解决方法是在子查询中按年份和月份进行分组,然后在主查询中根据年份和月份重新创建一个日期,然后您可以准确地输出您所要求的内容:

SELECT
  CASE
  WHEN extract(year FROM current_date) = yr
   AND extract(month FROM current_date) = mon THEN 'Current month'
  ELSE to_char((yr || '-' || mon || '-01')::date, 'TMMon/YYYY')
  END AS "Date",
  "Result"
FROM (
  SELECT extract(year FROM m.data) AS yr,
         extract(month FROM m.data) AS mon,
         sum(m.valor) AS "Result"
  FROM movimentacao m
  GROUP BY yr, mon) AS sum_by_yr_mon
ORDER by yr, mon;
此查询将按时间顺序进行排序,即使是在多年内,当前月份也是最后一个。

这很好

select 
   CASE WHEN 
        to_char(event_date, 'MM/YYYY')= to_char(CURRENT_DATE,'MM/YYYY')THEN 'Current Month'
        ELSE to_char(event_date, 'MM/YYYY')
   END as month_year,
sum(m.valor) as "Result" 
from movimentacao m 
group by 1 
order by 1;

在Postgres中尝试过,

这将在除4月/xxxx和8月/xxxx之外的所有其他月份之前对当前月份进行排序,并且月份通常不按时间顺序排列。@Patrick它将在2015年1月和2015年2月正确排序,并将当前月份放在最后一行,因为“c”在数字之后character@DanielMenegasso为此感到高兴,如果您使用OP要求的TMMonth/YYYY格式,请选择answer as Accepted排序不按时间顺序。如果年份为2014年,则变为不按时间顺序。说明错误:m列。数据必须出现在GROUP BY子句中,或用于聚合函数My bad中。您需要对年和月的数字日期值进行子查询,以获得正确的时间顺序排序,然后在主查询中对TMMon/yyy格式进行格式化。请注意,GROUP BY在计算价值和的子查询中完成,ORDER BY在主查询中完成,但使用子查询中的数字年和月值。