2015-05-11 58 views
1

我在尝试相同月份的值的总和,但结果是行与日期和值分隔。Postgres中的同一月的总和值

我的代码是

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得到错误,因为我在函数中使用m.data,我需要从m.data进行分组。

回答

0

您不应该GROUP BY m.data(推测是date),但是从您提取的月份。然后,您将遇到分组问题,唯一的解决方法是按年份和月份对子查询进行分组,然后在主查询中重新创建年份和月份的date,然后您可以输出正是你所要求的:

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; 

这个查询排序按时间顺序,甚至在多个年,“最近一个月”最后说到。

+0

那是给错误:列“m.data”必须出现在GROUP BY子句或聚合函数 –

+0

我不好使用。您需要对年份和月份的数值日期值进行子查询以获得适当的时间顺序,然后在主查询中对TMMon/YYYY格式进行格式设置。请注意,'GROUP BY'是在计算'valor'之和的子查询中完成的,而在主查询中使用'ORDER BY',但使用子查询中的数字年份和月份值。 – Patrick

+0

坦克男人,解决了我的问题! –

0

这工作得很好

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的尝试,DEMO

+0

这将在除“Apr/xxxx”和“Aug/xxxx”之外的所有其他月份之前对“当前月份”进行排序,月份通常不按时间顺序排列。 – Patrick

+1

坦克你,完美的作品 –

+0

@Patrick它正确排序飞蛾01/2015然后02/2015等,并把“本月在最后一排,因为'c'是数字字符 – 54l3d