来自不相关模型的PostgreSQL子查询计算

时间:2016-12-05 17:28:13

标签: sql postgresql subquery

我一直在尝试不同的方法,但不确定如何以最佳方式解决这个问题。

我有几个模型都与父“客户”模型相关。对于这个例子(与我的实际问题无关),让我们假设客户有电子邮件订单和电话订单。因此,每个电子邮件订单或电话订单都与客户相关,但彼此之间没有任何关系。

我想在客户端上运行查询并返回所有客户端,以及每个客户的订单中的字段总数(例如:USD Amount - 两个子模型中都存在的字段)以及可能的总税额对于这两个订单(因此要返回两个聚合列)。

一种方法是为每种情况运行子查询和另一个子查询 - 外部子查询对两个内部的总计进行求和。但是在这种情况下,当我尝试捕获两个字段时,我得到一个错误,说子查询只能返回一列。

这种结构的最佳方法是什么?

编辑:

表格结构(通过电子邮件/电话订单大量简化,具有与示例相同的结构)如下:

客户表 -

CREATE TABLE clients_client
(
  id integer NOT NULL,
  deleted boolean NOT NULL,
  company_name character varying(100)
)

电子邮件订单 -

CREATE TABLE clients_emailorders
(
  id serial NOT NULL,
  added_at timestamp with time zone NOT NULL,
  deleted boolean NOT NULL,
  tx_category integer NOT NULL,
  status integer NOT NULL,
  amount numeric(18,8) NOT NULL,
  tax numeric(18,8) NOT NULL,
  tx_id character varying(200) NOT NULL,
  completed_at timestamp with time zone,
  notes text,
  client_id integer NOT NULL
)

电话订单 -

CREATE TABLE clients_phoneorders
(
  id serial NOT NULL,
  added_at timestamp with time zone NOT NULL,
  deleted boolean NOT NULL,
  tx_category integer NOT NULL,
  status integer NOT NULL,
  amount numeric(18,8) NOT NULL,
  tax numeric(18,8) NOT NULL,
  tx_id character varying(200) NOT NULL,
  completed_at timestamp with time zone,
  notes text,
  client_id integer NOT NULL
)

我想要运行的查询(我目前没有任何工作,所以这是说明性的)有以下几点:

SELECT "clients_client"."id", "clients_client"."company_name", total_order_amount, total_order_tax
FROM "clients_client"
WHERE "clients_client"."deleted" = False

其中'total_order_amount'是两个子模型的所有订单金额的总和,'total_order_tax'是两个子模型的税金额的和。

我应该补充一点,每个客户可以拥有零个或多个订单类型。

1 个答案:

答案 0 :(得分:0)

使用UNION ALL运算符组合两个订单表,并将结果加入客户表:

SELECT c.company_name,
    sum( o.amount ) as amount,
    sum( o.tax ) as tax
FROM clients_client c
JOIN (
    SELECT client_id ,  amount, tax
    FROM clients_phoneorders
    UNION ALL
    SELECT client_id ,  amount, tax
    FROM clients_emailorders
) o
ON o.client_id = c.id
GROUP BY c.company_name