Sql 使用不同的条件从同一表中计算相同的列

Sql 使用不同的条件从同一表中计算相同的列,sql,google-bigquery,Sql,Google Bigquery,我正在GBQ上使用SQL 以下是我的表格的简化版本: Number | Amount | Name 4 10 A 1 0 B 6 100 A 8 0 C 5 0 A 4 10 C “编号”、“金额”或“名称”字段都没有唯一的值。 它们都可以重复很多次 我想计算每个“名称”的发生次数,其中金额=0除以该名称的总发生次数。 如下

我正在GBQ上使用SQL

以下是我的表格的简化版本:

Number | Amount | Name
 4        10       A
 1         0       B
 6        100      A
 8         0       C
 5         0       A
 4        10       C
“编号”、“金额”或“名称”字段都没有唯一的值。 它们都可以重复很多次

我想计算每个“名称”的发生次数,其中金额=0除以该名称的总发生次数。 如下所示:计数(金额=0)/计数(总数)

例如:

  • 对于A:1/3=0.33
  • 对于B:1/1=1
  • 对于C:1/2=0.5
要按“名称”获取总发生次数,我可以执行以下查询:

SELECT COUNT(*) Total, Name
FROM MyTable
GROUP BY Name
SELECT A.TotalZero/A.Total 
FROM
   (SELECT COUNT(*) Total, Name
    FROM MyTable) A ,
   (SELECT COUNT(*) TotalZero, Name
    FROM MyTable
    WHERE Amount>0) B
GROUP BY A.Name
要计算每个“名称”的金额=0:

如何在一个查询的结果中同时获得Total和TotalZero列,以便能够对它们进行分割

我尝试了以下查询:

SELECT COUNT(*) Total, Name
FROM MyTable
GROUP BY Name
SELECT A.TotalZero/A.Total 
FROM
   (SELECT COUNT(*) Total, Name
    FROM MyTable) A ,
   (SELECT COUNT(*) TotalZero, Name
    FROM MyTable
    WHERE Amount>0) B
GROUP BY A.Name
但是我需要一个列来连接这两个表,我不确定应该使用哪一个。 任何帮助都是有用的


注意:上面示例中的表实际上是子查询的结果。

一种方法是
countif()

另一种方法是使用
AVG()
进行条件聚合:


谢谢你的回复。它不起作用,因为COUNTIF(Amount=0)总是为所有“名称”返回0。我忘了提到该表是一个子查询。这就是原因吗?@HelpASisterOut。如果
countif()
返回
0
,则不存在
amount=0
的情况。无论您是从表还是子查询进行查询都无关紧要。是的,的确这是我的子查询中的一个问题-现在可以工作了,谢谢!
SELECT Name, AVG(CASE WHEN Amount = 0 THEN 1.0 ELSE 0 END)
FROM MyTable
GROUP BY Name;