SQL总和,仅对唯一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

我只想计算唯一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 = '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}');