2015-05-11 57 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