考虑两个表:
CREATE TABLE sales (
saleid INT,
saledateid INT,
saleamount DECIMAL(12,2)
);
CREATE TABLE salelines (
salelineid INT,
saleid INT,
quantity INT,
unitamount DECIMAL(12,2)
);
如果我想计算每天的总销售额:
SELECT sum(quantity * unitamount)
FROM sales
JOIN salelines USING (saleid)
GROUP BY saledateid;
在大多数情况下,sales.saleamount
是该销售的销售线的总和。但在某些情况下,saleamount
会被调整,这就是我们单独存储它的原因。因此,每天的实际总销售额将是:
SELECT sum(saleamount)
FROM sales
GROUP BY saledateid;
但是,我需要在物化视图的同一查询中同时使用这两个,以下不会起作用,因为可能会有多个销售线进行销售。
SELECT sum(quantity * unitamount), sum(saleamount)
FROM sales
JOIN salelines USING (saleid)
GROUP BY saledateid;
我该怎么做?我正在使用PostgreSQL,但我更倾向于符合SQL的解决方案。
答案 0 :(得分:2)
解决此问题的一种方法是向销售线添加序号。然后,您可以使用条件聚合仅选择一个值:
SELECT saledateid, sum(sl.quantity * sl.unitamount),
sum(case when seqnum = 1 then s.saleamount end)
FROM sales s JOIN
(SELECT sl.*, row_number() over (partition by saleid order by saleid) as seqnum
FROM salelines sl
) sl
USING (saleid)
GROUP BY saledateid;
row_number()
是ANSI标准函数,在大多数数据库中都可用。您的问题最初将MySQL作为标记,但在那里不可用。