2016-12-05 25 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