gpt4 book ai didi

sql - 前 3 个月的总和

转载 作者:行者123 更新时间:2023-11-29 11:59:51 25 4
gpt4 key购买 nike

我很难从 12 月(上个月第 3 个月)获取行。我正在尝试计算特定时间段内销售的产品数量。这是我当前的查询:

 SELECT
a.id,
a.default_code,
(
SELECT SUM(product_uom_qty)
AS
"Total Sold"
FROM
sale_order_line c
WHERE
c.product_id = a.id
),
(
SELECT SUM(product_uom_qty)
AS
"Month 3"
FROM sale_order_line c
WHERE
c.product_id = a.id
AND
MONTH(c.create_date) = MONTH(CURRENT_DATE - INTERVAL '3 Months')
AND
YEAR(c.create_date) = YEAR(CURRENT_DATE - INTERVAL '3 Months')
)
FROM
product_product a

这是数据库的样子:

sale_order_line

product_id product_uom_qty  create_date
33 230 2014-07-01 16:47:45.294313

product_product

id  default_code 
33 WHDXEB33

这是我收到的错误:

ERROR:  function month(timestamp without time zone) does not exist
LINE 21: MONTH(c.create_date) = MONTH(CURRENT_DATE - INTERVAL

有什么可以帮助我指明正确的方向吗?

最佳答案

使用date_trunc()计算时间戳边界:

SELECT id, default_code
, (SELECT SUM(product_uom_qty)
FROM sale_order_line c
WHERE c.product_id = a.id
) AS "Total Sold"
, (SELECT SUM(product_uom_qty)
FROM sale_order_line c
WHERE c.product_id = a.id
AND c.create_date >= date_trunc('month', now()) - interval '2 month'
AND c.create_date < date_trunc('month', now()) - interval '1 month'
) AS "Month 3"
FROM product_product a;

要获得十二月(现在是二月),请使用这些表达式:

    AND    c.create_date >= date_trunc('month', now()) - interval '2 month'
AND c.create_date < date_trunc('month', now()) - interval '1 month'

date_trunc('month', now()) 产生“2015-02-01 00:00”,减去 2 个月后得到“2014-12-01 00:00”。所以,“3 个月”可能是骗人的。

此外,请务必使用 sargable表达式 like demonstrated 以获得更快的性能并允许使用索引。

备选方案

根据您实际的数据库设计和数据分布,这可能会更快:

SELECT a.id, a.default_code, c."Total Sold", c."Month 3"
FROM product_product a
LEFT JOIN (
SELECT product_id AS id
, SUM(product_uom_qty) AS "Total Sold"
, SUM(CASE WHEN c.create_date >= date_trunc('month', now()) - interval '2 month'
AND c.create_date < date_trunc('month', now()) - interval '1 month'
THEN product_uom_qty ELSE 0 END) AS "Month 3"
FROM sale_order_line
GROUP BY 1
) c USING (id);

由于您要选择所有行,这可能比相关子查询更快。在您加入之前, 进行汇总,这样更便宜。
但是,在选择单个或少数产品时,这实际上可能会!比较:

或者在 Postgres 9.4+ 中使用 FILTER 子句:

...
, SUM(product_uom_qty)
FILTER (WHERE c.create_date >= date_trunc('month', now()) - interval '2 month'
AND c.create_date < date_trunc('month', now()) - interval '1 month'
) AS "Month 3"
...

详细信息:

关于sql - 前 3 个月的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28636191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com