SQL总和,仅对唯一id计数
我只想计算唯一ID的总和和计数SQL总和,仅对唯一id计数,sql,postgresql,join,aggregate-functions,exists,Sql,Postgresql,Join,Aggregate Functions,Exists,我只想计算唯一ID的总和和计数 SELECT COUNT(orders.id), SUM(orders.total), SUM(orders.shipping) FROM "orders" INNER JOIN "designer_orders" ON "designer_orders"."order_id" = "orders"."id" WHERE (designer_orders.state = 'pending' OR designer_orders.state = 'd
SELECT COUNT(orders.id), SUM(orders.total), SUM(orders.shipping) FROM "orders"
INNER JOIN "designer_orders" ON "designer_orders"."order_id" = "orders"."id"
WHERE (designer_orders.state = 'pending' OR
designer_orders.state = 'dispatched' OR
designer_orders.state = 'completed')
- 仅对唯一订单ID执行此操作
- 仅当orders.id唯一时添加orders.total。航运也是如此
- 避免添加重复项
orders
table内部联接designer\u orders
table:
OrderId Total Some designer order column
1 1000 2
1 1000 3
1 1000 5
2 100 7
3 133 8
4 1000 10
4 1000 20
在这种情况下:
- 订单数量应为4
- 订单总数应为2233
- 一个订单有许多设计师订单
- 一个设计器订单只有一个订单
- 这样试试看
SELECT COUNT(o.id) no_of_orders,
SUM(o.total) total,
SUM(o.shipping) shipping
FROM orders o JOIN
(
SELECT DISTINCT order_id
FROM designer_orders
WHERE state IN('pending', 'dispatched', 'completed')
) d
ON o.id = d.order_id
这里是演示,因为您只关心表designer\u orders中是否存在任何状态为的行,最明显的查询样式是半联接。通常最快,n表中可能有许多重复行:
SELECT COUNT(o.id) AS no_of_orders
,SUM(o.total) AS total
,SUM(o.shipping) AS shipping
FROM orders o
WHERE EXISTS (
SELECT 1
FROM designer_orders d
WHERE d.state = ANY('{pending, dispatched, completed}')
AND d.order_id = o.id
);
对于具有较大表的快速选择查询(并以一定的写入性能为代价),您可能会有如下结果:
索引条件必须与查询的WHERE
条件相匹配,才能说服查询计划员实际使用索引
如果有许多行的状态
不符合条件,则部分索引特别有吸引力。否则,总体而言,无条件索引可能是更好的选择。无法用您提供的信息回答您的问题far@Alexander我们还需要什么。请指定CREATE for your tables and sample
INSERT`s在我看来,这还不清楚。您能创建一个SQLFIDLE来演示您的场景吗?@ChrisFarmer只需检查更新即可。如果你仍然觉得你需要一把小提琴,那么请帮我一个忙,你能解释一下join关键字是如何在子查询上工作的吗?它的工作原理与通常的表相同。从派生表(您称之为子查询)中,我们返回感兴趣的order\u id
s(具有适当的状态),然后将其连接到orders
中,有效地过滤掉所有不匹配项。这也可以作为where子句使用。假设where order_id=无论子查询在where
子句中返回什么,您都必须在中使用,或EXISTS
以执行相同的操作<代码>连接
s通常优化得更好。
CREATE INDEX designer_orders_order_id_idx ON designer_orders (order_id)
WHERE state = ANY('{pending, dispatched, completed}');