繁体   English   中英

如何计算 SQL 中的组总和?

[英]How to calculate sum of group in SQL?

我试图找到如何计算一个新的 SQL 列,该列适用于涉及“NA”值的公式。 我认为由于“NA”值或由于我的分组,我没有得到我想要的结果。 请看下表和公式:

我的表如下:

website session score
 google    1       1
 google    2       NA
 bbc       3       2
 bbc       4       4
 bbc       5       5

我用来创建新计算字段的公式如下:

select
    website,
    (sum(score IN (4,5))/sum((score is not null)) - sum(score IN (1,2))/sum(score is not null))*100 as new_column
from 
    my_table
group by 
    website

本质上,该公式试图执行以下操作:

将分数列中 4 或 5 的值相加,然后将它们除以分数列中确实存在的数字的总和。

然后扣除以下内容:

将分数列中 1 或 2 的值相加,然后将它们除以分数列中确实存在的数字的总和。

最后:

将整个 output 乘以 100

该公式必须应用于每个组。

所以你应该有以下期望的结果:

只取第一组“google”

您有 4 个非 null 值。 您有 2 个值,其中值为 IN (1,2),0 值为 (4,5)。

所以你会有以下公式:

((0/4)-(2/4))*100

-2/4 * 100

= -50

但是,在 SQL 中计算时,我收到的值是 -100。 这对我来说没有意义。 谁能帮忙?

你有一个不是谷歌的 null 值。 它的总和是一。 所以你的公式导致 (0-1/1)*100 是-100,这就是它给出的结果。

我认为您想要的是所有 Google 记录的计数除以所有非空记录的计数?

我建议将每个总和乘以 1.0,这样它就不会将总和四舍五入为 int 值,这将导致“bbc”组为零(0)。

这是您查询的更新版本(也检查 SQL 小提琴http://sqlfiddle.com/#!5/5fca1/8 ):

select website,
    (sum(score IN (4,5)) * 1.0/sum(score is not null) - sum(score IN (1,2)) * 1.0/sum(score is not null))*100.0 as new_column
from my_table
group by website

我认为您正在寻找每组的(4,5)和(1,2)百分比之间的差异。 由于 null 值在聚合中被忽略,你可以简单地做

(avg(score in (4,5)) - avg(score in (1,2)))*100

从您的手动示例中,您可以先将所有非 null 值相加,然后在代码中使用该值 -

WITH NN_SUM AS (SELECT SUM(score is not null) NOT_NULL_SUM
                FROM my_table)
SELECT website,
       (((sum(score IN (4,5)) - sum(score IN (1,2))) / NOT_NULL_SUM) * 100 as new_column
FROM my_table
CROSS JOIN NN_SUM
GROUP BY website;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM