我对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对结果进行分组,以从不同的订单中获得每个项目的数量。我的问题是这个组,因为它也迫使我按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对结果进行分组的选项。在第一个查询中,qty将显示每一行的数量。第二个查询将按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注意“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唯一的区别是“按sub.item_id”分组--我知道sub.order_id不再代表行的ID,因为结果是由sub.item_id分组的
为了在Postgres中获得相同的结果,我需要从select中删除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发布于 2016-03-24 19:33:25
这是你想要的吗?
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,因为日期测试需要匹配。
具有讽刺意味的是,删除父母似乎是一个很小的改变。最初的查询相当高级。
发布于 2016-03-24 19:34:26
我想这会给你想要的输出。为了选择不聚合或包含在组中的值,需要使用子查询。
SELECT sub.order_id, items.item_id, items.qty
FROM orders sub
INNER JOIN orders par ON sub.order_id_parent = par.order_id
INNER JOIN
(
SELECT sub.item_id, sum(sub.item_qty) AS qty
FROM orders sub
INNER JOIN orders par ON sub.order_id_parent = par.order_id
WHERE par.order_date = '2016-03-24'
GROUP BY sub.item_id
) AS items ON sub.item_id = items.item_id
WHERE par.order_date = '2016-03-24'我改变了主意。我不知道你想要什么。如果您希望将订单按其父级和项进行分组,请使用以下命令。
SELECT sub.order_id_parent, sub.item_id, sum(sub.item_qty) AS qty
FROM orders sub
INNER JOIN orders par ON sub.order_id_parent = par.order_id
WHERE par.order_date = '2016-03-24'
GROUP BY sub.order_id_parent, sub.item_id发布于 2016-03-24 21:11:26
如果您想获得与特定订单无关的订单数量,请在选择后不要使用sub.order_id
test=# 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;
item_id | qty
---------+-----
1 | 7
2 | 2
(2 rows)https://stackoverflow.com/questions/36208214
复制相似问题