# #sql #database #google-bigquery
Вопрос:
У меня есть таблица, которая выглядит следующим образом:
этикетка | ценность |
---|---|
студент1 | 90 |
студент2 | 88 |
студент3 | 59 |
студент4 | 77 |
Я пытаюсь умножить два значения, если они удовлетворяют условию. Например, я хочу умножить значения для учащихся 1 и 3 вместе. Затем я хочу умножить значения для учащихся 2 и 4.
Для первого критерия я попробовал следующий код:
select
case
when
max(label) = "student1" or max(label) = "student3" then exp(SUM(log(value))) else 0 end as nominator
from four_students_table
К сожалению, это дает мне значение 0. Я также попытался просто сложить их вместе, но снова получил 0. Я не уверен, что я здесь делаю не так.
Ожидаемый результат:
числитель | знаменатель |
---|---|
5,310 | 6,776 |
Комментарии:
1. показать ожидаемый результат
2. Добавил это к вопросу @MikhailBerlyant
3. будет ли всего 4 студента? Вы использовали столбец
calc
в своем общемsql
наборе данных, но его нет в вашем общем наборе данных. Что такоеcalc
?4. @ggordon да, там будет только 4 студента.
5. Извините, «calc» должно было быть «значение». Я собираюсь исправить это сейчас. Но даже при этом я все равно получаю значение 0
Ответ №1:
Я case statement
, как показано в примере ниже, помог бы отфильтровать то, что вы хотели бы объединить.
Следующая скрипка обеспечивает желаемые результаты:
CREATE TABLE four_students_table (
label VARCHAR(8),
value INTEGER
);
INSERT INTO four_students_table
(label, value)
VALUES
('student1', '90'),
('student2', '88'),
('student3', '59'),
('student4', '77');
Запрос № 1
SELECT
SUM(CASE WHEN label='student1' THEN value ELSE 0 END)*
SUM(CASE WHEN label='student3' THEN value ELSE 0 END) as nominator,
SUM(CASE WHEN label='student2' THEN value ELSE 0 END)*
SUM(CASE WHEN label='student4' THEN value ELSE 0 END) as denominator
FROM
four_students_table;
номинант | знаменатель |
---|---|
5310 | 6776 |
Ответ №2:
Рассмотрим ниже (я чувствую, что это больше соответствует вашим намерениям/образцу в вашем вопросе)
select distinct
round(exp(sum(if(label in ('student1', 'student3'), ln(value), 0)) over())) as nominator,
round(exp(sum(if(label in ('student2', 'student4'), ln(value), 0)) over())) as denominator
from `project.dataset.four_students_table`
если применить к образцам данных в вашем вопросе — вывод будет