Умножьте в одном столбце

# #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`    
 

если применить к образцам данных в вашем вопросе — вывод будет

введите описание изображения здесь