2

我有以下查询,将 sum(rev) 列中的每一行除以列的总和。

对于以下示例,sum(rev) 列的总和为 23193。除法列由以下公式得出:行 in sum(rev)/sum(rev)

select date,id,sum(rev), 
NULLIF(rev,0) / sum(rev) over() as Divide
from test 
where month(date) = 11
and year(date) = 2012
and day(date) = 02
and id = 'Client1'
group by date,id,rev
having sum(rev) <> 0
order by date


date                  id      sum(rev)      Divide

2012-11-02 00:00:00 Client1     1562.00     0.067348
2012-11-02 00:00:00 Client1     1.00        0.000043
2012-11-02 00:00:00 Client1     4689.00     0.202173
2012-11-02 00:00:00 Client1     267.00      0.011512
2012-11-02 00:00:00 Client1     16674.00    0.718924

有2个问题

1.)当日(日期)条件被注释时,检索到的值是错误的。它在除法计算中没有给出正确的值

    date               sum(rev)         Divide
    2012-11-02 00:00:00 1.00            0.000002
    2012-11-02 00:00:00 267.00          0.000412
    2012-11-02 00:00:00 1562.00         0.002412
    2012-11-02 00:00:00 4689.00         0.007241
    2012-11-02 00:00:00 16674.00        0.025749

2.) 我想按日期分组。所以因为我们只有 2-11-2012 的记录,所以每天必须只有一行记录

请帮助修复这两个错误

参考:通过除以列的总和来查找列值

4

1 回答 1

2

如果您想date将每日总计除以总计,您可以这样做:

SELECT
  date,
  SUM(rev) AS total,
  SUM(rev) / SUM(SUM(rev)) OVER () AS portion
FROM test
GROUP BY
  date
;

也就是说, 的参数SUM() OVER ()应该是一个有效的表达式,并且rev在这个 GROUP BY 查询中不是一个有效的表达式,因为rev它不包含在 GROUP BY 中。但是您可以(并且应该)将SUM(rev)其用作参数,并且它将按预期工作。

如果您想为不同的客户端提供不同的结果,请添加id到 GROUP BY 子句并添加PARTITION BY id到窗口 SUM() 的 OVER 子句中,如下所示:

SELECT
  date,
  id,
  SUM(rev) AS total,
  SUM(rev) / SUM(SUM(rev)) OVER (PARTITION BY id) AS portion
FROM test
GROUP BY
  date,
  id
;

阅读手册中有关 OVER 子句的更多信息。

于 2012-10-29T13:27:28.050 回答