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
)使用聚合(例如SUM
、COUNT
),那么您需要在非聚合列上使用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.pCode
在SELECT
子句和GROUP BY
子句中的含义。如果您还想按orders.order_no
列出,那么您也可以将该列添加到两个子句中。
【讨论】:
输出给出了许多项目的列表,我正在从列表中查找总和和总数的总和以上是关于PostgreSQL 查询到 JOIN 和 SUM的主要内容,如果未能解决你的问题,请参考以下文章
postgreSQL计算总数sum if case when