postgresql中的sum返回单个值而不是聚合值

问题描述

我无法在数据库中使用sum()函数。我正在查询表purchases中的store_id(从表stores中检索),month(+年)购买时间(存储为timestamp ,没有时区指定),以及sum销售收入中的total(按月)。问题在于没有聚合发生,因此每个销售的总计被报告为给定商店的每月销售总计。我想我没有正确使用`sum()',但是我还没有找到解决方案。建议和意见表示赞赏。

SELECT --month of purchase,total sales
    purchases.store_id AS store_id,TO_CHAR(timestamp,'Month'||'YYYY') AS month,sum(total) AS total_sales
    FROM purchases
    GROUP BY store_id,timestamp,purchases.total
    ORDER BY month,store_id;

解决方法

您要按timestamp分组,而想按月分组。

考虑:

SELECT
    store_id,date_trunc('month',timestamp) AS month,sum(total) AS total_sales
FROM purchases
GROUP BY store_id,timestamp)
ORDER BY month,store_id;

这给您month作为截断到一个月的第一天的日期:我发现这比格式化的字符串更有意义,但是如果您将其更改回原始的to_char()表达式,喜欢。

请注意,PostgreSQL在GROUP BYORDER BY子句中也支持位置参数,您可以这样写:

SELECT
    store_id,sum(total) AS total_sales
FROM purchases
GROUP BY 1,2
ORDER BY 2,1;