sql - Postgres SUM 和 GROUP BY

标签 sql postgresql group-by

我对 Postgres 比较陌生。我正在使用 PostgreSQL 9.5.1。

我创建了简单的表格来说明我面临的问题。

CREATE TABLE orders (
    order_id integer NOT NULL,
    order_id_parent integer,
    order_date date,
    item_id integer,
    item_qty integer
);

这是示例数据。

order_id | order_id_parent |order_date | item_id | item_qty
1           0               2016-03-24      0       0
2           1               NULL            1       2
3           1               NULL            2       2
4           0               2016-03-24      0       0
5           4               NULL            1       5

我想选择 2016-03-24 的所有订单,对数量求和并按 sub.item_id 对结果进行分组,以获取不同订单中每个商品的数量。我的问题是 GROUP,因为它也迫使我按 sub.order_id 分组,但我没有得到想要的结果,因为我希望结果仅按 sub.item_id 分组。这是我的查询:

SELECT sub.order_id, sub.item_id, SUM(sub.item_qty) AS qty
FROM orders sub
LEFT JOIN orders par ON sub.order_id_parent = par.order_id
WHERE TRUE AND par.order_date = '2016-03-24'
GROUP BY sub.item_id, sub.order_id

提前致谢。

更新

@fqhv、@Gordon Linoff 和@alxgrh 的回答很有帮助,向我展示了解决问题的不同方法。

我想要实现的是一个输出不同结果的查询。最终用户需要可以选择按 sub.order_id 或 sub.item_id 对结果进行分组。在第一个查询中,数量将显示每行的数量。第二个查询将按 sub.item_id 对结果进行分组,并显示每个 sub.item_id 的所有数量的总和。我来自 MYSQL 世界,这是完全可行的,结果是查询/代码的简单性。看来我需要有两个不同的查询才能获得正确的结果。我将按照我期望的方式发布在 MYSQL 中工作的查询。

SELECT sub.order_id, sub.item_id, SUM(sub.item_qty) AS qty
FROM orders sub JOIN orders par ON sub.order_id_parent = par.order_id
WHERE par.order_date = '2016-03-24'
GROUP BY sub.order_id

注意“GROUP BY sub.order_id

SELECT sub.order_id, sub.item_id, SUM(sub.item_qty) AS qty
FROM orders sub JOIN orders par ON sub.order_id_parent = par.order_id
WHERE par.order_date = '2016-03-24'
GROUP BY sub.item_id

唯一的区别是“GROUP BY sub.item_id” 我知道 sub.order_id 不再代表行的 ID,因为结果按 sub.item_id

分组

为了在 Postgres 中获得相同的结果,我需要从选择中删除 sub.order_id 以避免按 sub.order_id 分组,这显然不会产生预期的结果.我在 Postgre 中的查询是:

SELECT sub.item_id, SUM(sub.item_qty) AS qty 
FROM orders sub 
  LEFT JOIN orders par ON sub.order_id_parent = par.order_id 
WHERE TRUE AND par.order_date = '2016-03-24' 
GROUP BY sub.item_id

最佳答案

这是你想要的吗?

SELECT sub.item_id, SUM(sub.item_qty) AS qty
FROM orders sub JOIN
     orders par
     ON sub.order_id_parent = par.order_id
WHERE par.order_date = '2016-03-24'
GROUP BY sub.item_id;

您不需要 LEFT JOIN,因为日期测试需要匹配。

具有讽刺意味的是,删除父级似乎是一个非常小的变化。原始查询非常高级。

关于sql - Postgres SUM 和 GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36208214/

相关文章:

php - 进行 CodeIgniter 数据库查询

mysql - 什么时候用sql,什么时候用存储过程?

mysql - 从另一个字段排序的数据库中选择不同的行

sql-server - SQL Group By Cube 并获取每个组合的总计

javascript - Sequelize 中的 FOR SHARE 和 FOR UPDATE 语句

sql - PL/SQL varchar(10)到varchar(9)

python-3.x - 由于使用 Docker 的 PostgresDB 连接失败,无法启动 Apache Superset

postgresql - 无法重新启动 postgres 集群,因为不存在用户 ID,无法添加具有该 ID 的用户,因为它存在

sql - Rails Postgres 功能索引

pandas - 在两个 pandas 数据帧之间分配值