首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres求和群

问Postgres求和群
EN

Stack Overflow用户
提问于 2016-03-24 19:10:44
回答 3查看 4.6K关注 0票数 3

我对Postgres比较陌生。我使用的是PostgreSQL 9.5.1。

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

代码语言:javascript
复制
CREATE TABLE orders (
    order_id integer NOT NULL,
    order_id_parent integer,
    order_date date,
    item_id integer,
    item_qty integer
);

这是样本数据。

代码语言:javascript
复制
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分组的结果。以下是我的疑问:

代码语言:javascript
复制
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中工作的查询。

代码语言:javascript
复制
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”组“

代码语言:javascript
复制
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的查询是:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2016-03-24 19:33:25

这是你想要的吗?

代码语言:javascript
复制
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,因为日期测试需要匹配。

具有讽刺意味的是,删除父母似乎是一个很小的改变。最初的查询相当高级。

票数 2
EN

Stack Overflow用户

发布于 2016-03-24 19:34:26

我想这会给你想要的输出。为了选择不聚合或包含在组中的值,需要使用子查询。

代码语言:javascript
复制
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'

我改变了主意。我不知道你想要什么。如果您希望将订单按其父级和项进行分组,请使用以下命令。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2016-03-24 21:11:26

如果您想获得与特定订单无关的订单数量,请在选择后不要使用sub.order_id

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36208214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档