Fre*_*chi 133 sql postgresql
我在Postgres服务器上有以下数据库表:
id date Product Sales
1245 01/04/2013 Toys 1000
1245 01/04/2013 Toys 2000
1231 01/02/2013 Bicycle 50000
456461 01/01/2014 Bananas 4546
Run Code Online (Sandbox Code Playgroud)
我想创建一个查询,给出SUM了的Sales按月份和年份如下列并对结果进行分组:
Apr 2013 3000 Toys
Feb 2013 50000 Bicycle
Jan 2014 4546 Bananas
Run Code Online (Sandbox Code Playgroud)
有一个简单的方法吗?
Bur*_*lan 263
我无法相信接受的答案有这么多的赞成 - 这是一种可怕的方法.
使用date_trunc,这是正确的方法:
SELECT date_trunc('month', txn_date) AS txn_month, sum(amount) as monthly_sum
FROM yourtable
GROUP BY txn_month
Run Code Online (Sandbox Code Playgroud)
这是不好的做法,但如果你使用,你可能会被原谅
GROUP BY 1
Run Code Online (Sandbox Code Playgroud)
在一个非常简单的查询中.
你也可以使用
GROUP BY date_trunc('month', txn_date)
Run Code Online (Sandbox Code Playgroud)
如果您不想选择日期.
bma*_*bma 186
select to_char(date,'Mon') as mon,
extract(year from date) as yyyy,
sum("Sales") as "Sales"
from yourtable
group by 1,2
Run Code Online (Sandbox Code Playgroud)
应Radu的要求,我将解释该查询:
to_char(date,'Mon') as mon, :将"日期"属性转换为月份的缩写形式的定义格式.
extract(year from date) as yyyy :Postgresql的"提取"功能用于从"日期"属性中提取YYYY年份.
sum("Sales") as "Sales" :SUM()函数将所有"Sales"值相加,并提供区分大小写的别名,使用双引号保持区分大小写.
group by 1,2:GROUP BY函数必须包含SELECT列表中不属于聚合的所有列(也就是所有不在SUM/AVG/MIN/MAX等函数内的列).这告诉查询应该为每个唯一的列组合应用SUM(),在这种情况下,列是月和年列."1,2"部分是简写而不是使用列别名,尽管最好使用完整的"to_char(...)"和"extract(...)"表达式来提高可读性.
mgo*_*ser 29
to_char 实际上让你一举拔出年份和月份!
select to_char(date('2014-05-10'),'Mon-YY') as year_month; --'May-14'
select to_char(date('2014-05-10'),'YYYY-MM') as year_month; --'2014-05'
Run Code Online (Sandbox Code Playgroud)
或者在上述用户示例的情况下:
select to_char(date,'YY-Mon') as year_month
sum("Sales") as "Sales"
from some_table
group by 1;
Run Code Online (Sandbox Code Playgroud)
jia*_*ian 12
为什么不直接使用date_part函数呢?https://www.postgresql.org/docs/8.0/functions-datetime.html
SELECT date_part('year', txn_date) AS txn_year,
date_part('month', txn_date) AS txn_month,
sum(amount) as monthly_sum
FROM payment
GROUP BY txn_year, txn_month
order by txn_year;
Run Code Online (Sandbox Code Playgroud)
小智 6
还有另一种方法可以使用 postgres 中的 date_part() 函数来实现结果。
SELECT date_part('month', txn_date) AS txn_month, date_part('year', txn_date) AS txn_year, sum(amount) as monthly_sum
FROM yourtable
GROUP BY date_part('month', txn_date)
Run Code Online (Sandbox Code Playgroud)
谢谢
看一下本教程的示例 6) -> https://www.postgresqltutorial.com/postgresql-group-by/
您需要在 GROUP BY 上调用该函数,而不是调用在 select 上创建的虚拟属性的名称。我正在按照上面建议的所有答案进行操作,但出现了错误column 'year_month' does not exist。
对我有用的是:
SELECT
date_trunc('month', created_at), 'MM/YYYY' AS month
FROM
"orders"
GROUP BY
date_trunc('month', created_at)
Run Code Online (Sandbox Code Playgroud)