我有一个查询,用于为客户生成总订单金额,并将它们按月分组到代表总订单金额的另一列旁边。
这是架构:
temp=# \d+ customers;
Table "pg_temp_2.customers"
Column | Type | Modifiers | Storage | Description
------------+-----------------------------+-----------+----------+-------------
id | integer | not null | plain |
created_at | timestamp without time zone | | plain |
name | text | | extended |
Indexes:
"customers_pkey" PRIMARY KEY, btree (id)
Referenced by:
TABLE "orders" CONSTRAINT "orders_customer_id_fkey" FOREIGN KEY (customer_id) REFERENCES customers(id)
Has OIDs: no
Table "pg_temp_2.orders"
Column | Type | Modifiers | Storage | Description
-------------+-----------------------------+---------------+---------+-------------
id | integer | not null | plain |
created_at | timestamp without time zone | default now() | plain |
customer_id | integer | | plain |
amount | integer | | plain |
Indexes:
"orders_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"orders_customer_id_fkey" FOREIGN KEY (customer_id) REFERENCES customers(id)
Has OIDs: no
为方便起见,我添加了 create table 语句:
create temporary table customers ( id integer primary key, created_at timestamp without time zone, name text);
create temporary table orders ( id integer primary key, created_at timestamp without time zone, customer_id integer references customers(id));
这是我正在使用的查询:
SELECT
c.name,
sum(o.amount),
CAST(SUM(
CASE
WHEN date_trunc('month', o.created_at) BETWEEN '2012-10-01' AND ('2012-11-01'::date - '1 day'::interval)
THEN o.amount
ELSE 0
END
) / 100.0 AS MONEY) october2012,
CAST(SUM(
CASE
WHEN date_trunc('month', o.created_at) BETWEEN '2012-11-01' AND ('2012-12-01'::date - '1 day'::interval)
THEN o.amount
ELSE 0
END
) / 100.0 AS MONEY) as november2012
FROM orders o
INNER JOIN customers c ON o.customer_id = c.id
WHERE o.created_at >= '01 October 2012'
AND o.created_At < '01 December 2012'
GROUP BY
c.name
ORDER BY
october2012 desc;
我怎样才能摆脱那个丑陋的案例陈述?必须有一种更优雅的方式在某个时间片内汇总这些查询。我尝试使用窗口函数,但失败得很惨。任何援助将不胜感激!
我正在使用 postgresql 9.1