Postgres 中同月的总和值
sum values of the same month in 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.
分组
你不应该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;
此查询将按时间顺序排序,即使是多年,"Current month" 排在最后。
这个很好用
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
我尝试对同月的值求和,但结果是日期和值分开的行。
我的密码是
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.
分组你不应该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;
此查询将按时间顺序排序,即使是多年,"Current month" 排在最后。
这个很好用
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