使用SQL减少/汇总多个表?

时间:2014-11-19 00:01:49

标签: sql postgresql

考虑两个表:

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的解决方案。

1 个答案:

答案 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作为标记,但在那里不可用。