#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. Да, действительно, это была проблема в моем подзапросе — теперь работает, спасибо!