我对 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/