Считать один и тот же столбец из одной и той же таблицы с разными условиями

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

Я использую SQL в GBQ.

Вот упрощенная версия моей таблицы :

 Number | Amount | Name
 4        10       A
 1         0       B
 6        100      A
 8         0       C
 5         0       A
 4        10       C
 

Ни одно из полей «Число», «Сумма» или «Имя» не имеет уникальных значений.
Все они могут повторяться много раз.

Я хочу вычислить вхождения, в которых каждое «Имя» имеет Amount = 0, деленное на общее вхождение этого имени. Например, следующее: Count(сумма = 0) / Count (всего)

Например :

  • Для A: 1/3 = 0,33
  • Для B: 1/1 = 1
  • Для C: 1/2 = 0,5

Чтобы получить общее количество вхождений по «Имени», я мог бы выполнить следующий запрос :

 SELECT COUNT(*) Total, Name
FROM MyTable
GROUP BY Name
 

Для подсчета суммы = 0 для каждого «Имени» :

 SELECT COUNT(*) TotalZero, Name
FROM MyTable
WHERE Amount>0
GROUP BY Name
 

Как я могу получить столбцы Total и TotalZero в результате 1 запроса, чтобы иметь возможность разделить их?

Я попробовал следующий запрос :

 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
 

Но мне нужен столбец, чтобы объединить 2 таблицы, и я не уверен, какой из них мне следует использовать.
Любая помощь была бы полезна.

Примечание: Таблица в моем примере выше на самом деле является результатом подзапроса.

Ответ №1:

Один из методов countif() :

 SELECT Name, COUNTIF(Amount = 0) * 1.0 / COUNT(*) 
FROM MyTable
GROUP BY Name;
 

Другим методом является условное агрегирование с использованием AVG() :

 SELECT Name, AVG(CASE WHEN Amount = 0 THEN 1.0 ELSE 0 END)
FROM MyTable
GROUP BY Name;
 

Комментарии:

1. Спасибо за ответ. Это не сработало, потому что COUNTIF(Amount = 0) всегда возвращает 0 для всех «имен».

2. Я забыл упомянуть, что таблица является подзапросом. Может ли это быть причиной?

3. @HelpASisterOut . , , если countif() возвращает 0 , то нет случаев, когда amount = 0 . Неважно, выполняете ли вы запрос из таблицы или подзапроса.

4. Да, действительно, это была проблема в моем подзапросе — теперь работает, спасибо!