【问题标题】:Calculate balance amount per prodcuct in redshift计算红移中每个产品的余额
【发布时间】:2023-01-18 15:56:41
【问题描述】:

DB-Fiddle

CREATE TABLE inventory (
    id SERIAL PRIMARY KEY,
    stock_date DATE,
    product VARCHAR(255),
    inbound_quantity INT,
    outbound_quantity INT
);

INSERT INTO inventory
(stock_date, product, inbound_quantity, outbound_quantity
)
VALUES 
('2020-01-01', 'Product_A', '900', '0'),
('2020-01-02', 'Product_A', '0', '300'),
('2020-01-03', 'Product_A', '400', '250'),
('2020-01-04', 'Product_A', '0', '100'),
('2020-01-05', 'Product_A', '700', '500'),
  
('2020-01-03', 'Product_B', '850', '0'),
('2020-01-08', 'Product_B', '100', '120'),
('2020-02-20', 'Product_B', '0', '360'),
('2020-02-25', 'Product_B', '410', '230'),

预期结果:

stock_date product inbound_quantity outbound_quantity balance
2020-01-01 Product_A 900 0 900
2020-01-02 Product_A 0 300 600
2020-01-03 Product_A 400 250 750
2020-01-04 Product_A 0 100 650
2020-01-05 Product_A 700 500 850
2020-01-03 Product_B 740 0 740
2020-01-08 Product_B 100 120 720
2020-02-20 Product_B 0 360 360
2020-02-25 Product_B 410 230 540
2020-03-09 Product_B 290 0 830

我想计算每个产品的余额。
到目前为止,我已经能够在下面开发这个查询,但它不起作用。
我收到错误 window "product" does not exist


SELECT 
iv.stock_date AS stock_date,
iv.product AS product,
iv.inbound_quantity AS inbound_quantity,
iv.outbound_quantity AS outbound_quantity,
SUM(iv.inbound_quantity - iv.outbound_quantity) OVER 
(product ORDER BY stock_date ASC ROWS UNBOUNDED PRECEDING) AS Balance
FROM inventory iv
GROUP BY 1,2,3,4
ORDER BY 2,1;

我需要如何修改查询才能使其工作?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    错误消息“product”不存在是因为您试图在 OVER 子句中引用列“product”,但它不包含在 GROUP BY 子句中。

    要解决此问题,您需要在 GROUP BY 子句中包含“product”列,并在 OVER 子句中添加一个 partition by 子句,以便 SUM 函数计算每个产品的余额。

    试试这个查询:

    SELECT 
        iv.stock_date AS stock_date,
        iv.product AS product,
        iv.inbound_quantity AS inbound_quantity,
        iv.outbound_quantity AS outbound_quantity,
        SUM(iv.inbound_quantity - iv.outbound_quantity) OVER 
        (PARTITION BY product ORDER BY stock_date ASC ROWS UNBOUNDED PRECEDING) AS Balance
    FROM inventory iv
    GROUP BY 1,2,3,4
    ORDER BY 2,1;

    这样,SUM 函数只会对每个产品的 inbound_quantity - outbound_quantity 求和,而不是对所有产品求和。

    查询将返回预期的结果。

    【讨论】:

      【解决方案2】:

      你快到了

      您应该在产品前面添加分区

      SELECT 
      iv.stock_date AS stock_date,
      iv.product AS product,
      iv.inbound_quantity AS inbound_quantity,
      iv.outbound_quantity AS outbound_quantity,
      SUM(iv.inbound_quantity - iv.outbound_quantity) OVER 
      (partition by product ORDER BY stock_date ASC ROWS UNBOUNDED PRECEDING) AS Balance
      FROM inventory iv
      GROUP BY 1,2,3,4
      ORDER BY 2,1;
      

      所以,它应该是这样的

      【讨论】:

        猜你喜欢
        • 2021-08-14
        • 2019-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多