2017-02-09 60 views
0

很難從標題來解釋,但這是我的SQL:如何做到哪裏<before>聚合函數(Postgres的)

SELECT 
    SUM("payments"."amount"), 
    "invoices"."property_id" 
FROM "payments" 
JOIN "invoices" 
    ON "payments"."invoice_id" = "invoices"."id" 
GROUP BY "property_id" 

它返回的所有Payment記錄(amount列)之和爲特定Property(通過發票連接)。

換句話說:

Property has_many: :invoices 
Invoice has_one: :payment 

我想選擇一個特定的日期範圍之間的支付,雖然,但它具有聚合函數(這樣做上面的確切查詢「之前」的出現,但只2017-01-01至2017-02-01)。該字段將是generated_atPayment

+0

WHERE子句在聚合之前執行。 –

+0

該死的真的......?我是一個白癡 – Tallboy

+0

我甚至沒有嘗試過,我只是認爲那不會工作...... doh! – Tallboy

回答

0

您正在尋找一個WHERE條款。 (WHERE在聚合之前執行; HAVING之後執行。)PostgreSQL中的建議日期文字是ANSI標準DATE 'YYYY-MM-DD'。日期範圍通常以> =開始日期和<結束日期+ 1(爲了正確處理時間部分(如果有的話))進行檢查。

SELECT 
    SUM(p.amount), 
    i.property_id 
FROM payments p 
JOIN invoices i ON p.invoice_id = i.id 
WHERE p.generated_at >= DATE '2017-01-01' 
    AND p.generated_at < DATE '2017-02-02' 
GROUP BY i.property_id; 
+0

日期沒有時間部分 –

+0

@a_horse_with_no_name:您如何知道generated_at的數據類型?它在任何地方都沒有提及。 –