[英]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.