我一直在尝试不同的方法,但不确定如何以最佳方式解决这个问题。
我有几个模型都与父“客户”模型相关。对于这个例子(与我的实际问题无关),让我们假设客户有电子邮件订单和电话订单。因此,每个电子邮件订单或电话订单都与客户相关,但彼此之间没有任何关系。
我想在客户端上运行查询并返回所有客户端,以及每个客户的订单中的字段总数(例如: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'是两个子模型的税金额的和。
我应该补充一点,每个客户可以拥有零个或多个订单类型。
答案 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