PostgreSQL 查询到 JOIN 和 SUM

Posted

技术标签:

【中文标题】PostgreSQL 查询到 JOIN 和 SUM【英文标题】:PostgreSQL Query to JOIN and SUM 【发布时间】:2020-01-24 21:19:13 【问题描述】:

我有 2 张桌子:

    订单 订单项

SUM TOTAL(产品总价)保存在表订单字段total 中。我需要连接这两个表并从订单表中保存的值中获取总和和计数,下面是一个示例

SELECT  
   count(orders.id), sum(orders.total) 
FROM
  orders
INNER JOIN orderItems ON  orderItems.order_no =  orders.order_no 
AND  orders.order_no LIKE 'P%' AND orderItems.pCode IN ('1','2','3','4')

如何从单个查询中获取总和和计数?

【问题讨论】:

你能包含样本输入/输出吗? order_no count sum P000003013 4 6713.48 P000003023 1 2712.50 P000003025 2 3733.39 P000003313 1 6333.78 P000003313 2 6834.48 的总和和总计数列表跨度> 抱歉问题正在更新,因为它令人困惑 SELECT count(orders.id) AS CC , sum(orders.total_ordered) AS TT FROM orders WHERE orders.order_no LIKE 'P%' Order table has total and在 2 个字段中添加的总和并使用 order_no 以 P 开头进行过滤,我需要加入 orderItems ON orders.order_no =orderItems.order_no AND orderItems PCode IN ('1','2','3','4')跨度> 【参考方案1】:

这是在黑暗中刺伤,但根据您更新的 cmets,我想我可能知道您在处理什么。似乎您正在对“订单”表中的订单标题级别进行求和并计数,但是通过加入行表,您将获得多条记录,从而获得两个聚合的看似任意的乘法。

如果是这种情况,如果有一行或多行满足您的条件(1、2、3、4 中的 pCode),您只想对订单标题进行求和和计数,那么您想要的是半加入,使用exists 子句。

SELECT  
   count(orders.id), sum(orders.total) 
FROM
  orders o
where
  o.order_no like 'P%' and
  exists (
    select null
    from orderItems i
    where
      o.order_no = i.order_no and
      i.pCode in ('1', '2', '3', '4')
  )

即使您有多行满足您的条件,它仍然只会对每个标题求和一次。语法需要一些时间来适应,但结构本身非常有用且高效。另一种选择是子查询“in”列表,它在 PostgreSQL 上对于大型数据集的运行效率不高。

如果这不是您的意思,请使用示例数据和您期望看到的最终输出来编辑您的问题。

【讨论】:

是的,这个查询,使用我使用的查询 SELECT count(orders.id),SUM(orders.total) FROM orders,orderItems WHERE (orders.order_no=orderItems.order_no) AND orders。 order_no LIKE 'P%' AND orderItems.part_no IN ('1','2','3','4','5') AND (DATE(orders.date) BETWEEN '2020-01-01' AND ' 2020-01-31') ,我得到了不同的结果。基本上总数和计数来自订单表和订单项表中的零件号过滤器,按订单日期过滤。 如果您可以使用示例数据和预期结果更新您的问题,我敢打赌我们可以提供帮助【参考方案2】:

如果您想跨值(例如pCode)使用聚合(例如SUMCOUNT),那么您需要在非聚合列上使用GROUP BY 子句:

SELECT  
    orderItems.pCode,
    COUNT(orders.id) AS order_count,
    SUM(orders.total) AS order_total
FROM orders
INNER JOIN orderItems
    ON orderItems.order_no = orders.order_no 
WHERE orders.order_no LIKE 'P%'
AND orderItems.pCode IN ('1','2','3','4')
GROUP BY
    orderItems.pCode

注意orderItems.pCodeSELECT 子句和GROUP BY 子句中的含义。如果您还想按orders.order_no 列出,那么您也可以将该列添加到两个子句中。

【讨论】:

输出给出了许多项目的列表,我正在从列表中查找总和和总数的总和

以上是关于PostgreSQL 查询到 JOIN 和 SUM的主要内容,如果未能解决你的问题,请参考以下文章

postgreSQL计算总数sum if case when

用于 JOIN 查询的 Postgresql 分页性能

Rails查询'join'和'sum''

SQL查询sum和max一个表,join得到另一个表的对应值

postgresql----JOIN之多表查询

Oracle 在字符串上的 OUTER JOIN (+) - 迁移 PostgreSQL