2016-12-05 79 views
0

我一直在尝试不同的方式做到这一点,但不知道如何去最好的方式。PostgreSQL子查询计算从不相关的模型

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

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

一种方法是在每个案例中运行子查询和另一个子查询 - 外部子查询将两个内部的总和相加。但是,在这种情况下,当我尝试捕获两个字段时,出现错误,说明子查询只能返回一列。

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

编辑:

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

客户端表 -

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”是的SUM所有子模型的订单金额和'total_order_tax'都是两个子模型的税额总和。

我应该补充说,每个客户端可以有零个或更多的每个订单类型。

+0

'说子查询只能返回一个column.'这是一个* *标子查询。通常,子查询可以产生多于一行的行数,实际上是一个表表达式。只要给它一个别名并参考它的字段。 – joop

+1

请编辑您的问题,为正在讨论的表格和您正在使用的查询添加'create table'语句。 [_Formatted_](http://stackoverflow.com/help/formatting)**文本**请[无屏幕截图](http://meta.stackoverflow.com/questions/285551/why-may-i-not上传图片的代码时,要求一个问题/ 285557#285557) –

+0

我已编辑上面的原始问题,以包括此。 – visionjcv

回答

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 
+0

即使两个子模型彼此完全不同,只要它们都有一个client_id字段和要操作的数量字段(不像上面的示例),您是否会推荐这种方法? – visionjcv

+0

是的。表格的结构可以完全不同,没关系。文档中解释了唯一的限制:https:// www。postgresql.org/docs/current/static/queries-union.html'这两个查询必须是“联合兼容的”,这意味着它们返回相同数量的列并且相应的列具有兼容的数据类型,如10.5节所述.' – krokodilko