Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何计算哪些元素的平均值_Sql_Postgresql - Fatal编程技术网

Sql 如何计算哪些元素的平均值

Sql 如何计算哪些元素的平均值,sql,postgresql,Sql,Postgresql,我和博士后一起工作 我有一个带有以下字段的表tbl:名称、单词 字段类型为字符串 我需要计算每个aaa的名字中不为空的单词的平均百分比 我试过这样的方法: SELECT AVG(COUNT(words is not null) - count(*)) FROM tbl WHERE name="test" 但我得到了以下错误: aggregate function calls cannot be nested 我试图将查询更改为: SELECT (AVG((SELECT COUNT(*) FR

我和博士后一起工作

我有一个带有以下字段的表tbl:名称、单词 字段类型为字符串

我需要计算每个aaa的名字中不为空的单词的平均百分比

我试过这样的方法:

SELECT AVG(COUNT(words is not null) - count(*))
FROM tbl
WHERE name="test"
但我得到了以下错误:

aggregate function calls cannot be nested
我试图将查询更改为:

SELECT (AVG((SELECT COUNT(*) FROM tbl WHERE words IS NOT NULL) - (SELECT COUNT(*) FROM tbl))
FROM tbl
WHERE name="test" 
但我似乎得到了错误的价值观

例如,对于下表:

name,   words 
----------------------------
test    abc test, 1, 2, 3
t2      NULL
test    NULL
t3      NULL
t2      a,b,c,d,e
test    def zxy
t2      NULL
测试的结果需要是2/3,因为有2个测试结果不为空,并且表中有3个测试

如何以正确的方式编写查询?

您不能嵌套它

因此,使用子查询:

SELECT  
1.0*sum((case when a.words is null then 0 else 1 end))/
(SELECT  count(*) FROM tbl b WHERE b.name= a.name group by b.name)
FROM tbl a
WHERE a.name= 'test'
group by name 
输出:

Avg_
0.666666666666
你不能把它藏起来

因此,使用子查询:

SELECT  
1.0*sum((case when a.words is null then 0 else 1 end))/
(SELECT  count(*) FROM tbl b WHERE b.name= a.name group by b.name)
FROM tbl a
WHERE a.name= 'test'
group by name 
输出:

Avg_
0.666666666666
我找到了解决办法:

SELECT CAST((CAST((SELECT COUNT(*)
FROM tbl
WHERE name="test" and words IS NOT NULL) as float)/(SELECT COUNT(*)FROM tbl WHERE name="test")) as float) as result
FROM tbl
WHERE name="test"
GROUP BY Country
我找到了解决办法:

SELECT CAST((CAST((SELECT COUNT(*)
FROM tbl
WHERE name="test" and words IS NOT NULL) as float)/(SELECT COUNT(*)FROM tbl WHERE name="test")) as float) as result
FROM tbl
WHERE name="test"
GROUP BY Country

发布样本数据和预期结果以澄清您的需求。发布样本数据和预期结果以澄清您的需求。我得到的是0,0,0的数组。。。在结果中,它不好,它需要是一个值。我添加了一个示例,说明我期望的结果是正确的,现在你得到2/3,结果是0.6666。让我知道我得到的是0,0,0的数组。。。在结果中,它不好,它需要是一个值。我添加了一个示例,说明我期望的结果是正确的,现在你得到2/3,结果是0.6666。让我知道