指定要搜索的年份,而不使用 WHERE 子句

问题描述 投票:0回答:1

我正在尝试返回 2015 年每个月的总销售额。我的表包含 2000 年到 2019 年的数据。当我在下面编写查询时,我会得到所有年份每个月的销售额。如何将范围缩小到 2015 年?

SELECT extract(year FROM ord_date) AS year
 , extract(month FROM ord_date) AS month
 , SUM(order_tot) AS Total_Sales 
FROM dsci_504.orders   
GROUP BY extract(year FROM ord_date), extract(month FROM ord_date)
ORDER BY year, month;

我的输出的前四行应如下所示:

总销售额
2015 1 55527.73
2015 2 53219.29
2015 3 53661.72
2015 4 109908.03
sql postgresql group-by
1个回答
0
投票

已澄清“没有

WHERE
条款”是一个误解。

使用正确的“可控制”谓词以获得最佳性能。
使用单个截断的时间戳列更简单、更便宜:

SELECT date_trunc('month', ord_date) AS mon
     , sum(order_tot) AS total_sales 
FROM   dsci_504.orders
WHERE  ord_date >= '2005-01-01'  -- valid as date or timestamp constant
AND    ord_date <  '2006-01-01'
GROUP  BY 1
ORDER  BY 1;

ord_date
可以输入
date
timestammp
,两者都适用。 甚至适用于
timestamptz
。如果没有明确定义,Postgres 会假定当前会话的时区。

如果您确实需要

numeric
年和月的输出:

SELECT extract(year FROM mon) AS year
     , extract(month FROM mon) AS month
     , total_sales 
FROM  (
   SELECT to_char(date_trunc('month', ord_date), 'YYYY') AS mon
        , sum(order_tot) AS total_sales 
   FROM   dsci_504.orders
   WHERE  ord_date >= '2005-01-01'  -- valid timestamp constant
   AND    ord_date <  '2006-01-01'
   GROUP  BY 1
   ORDER  BY 1
   ) sub;
© www.soinside.com 2019 - 2024. All rights reserved.