Два разных условия для двух разных столбцов с использованием оператора case в SQL

#sql #postgresql

#sql #postgresql

Вопрос:

Дана таблица случайных чисел следующим образом: ** Схема таблицы Person **

  • Имя
  • Отметка1
  • Marks2

Я хочу вернуть таблицу с аналогичной структурой и заголовками, где, если сумма столбца нечетная, столбец показывает максимальное значение для этого столбца, а когда сумма четная, она показывает минимальное значение с помощью оператора case.

** схема выходной таблицы **

  • Отметка1
  • Marks2

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

 select Marks1,Marks2 ,
  (case
      when mod(sum(Marks1),2)=0 then
          min(Marks1)
      else max(Marks1)
  end) as Marks1 , 
  (case 
   when mod(sum(Marks2),2)=0 then
          min(Marks2)
      else max(Marks2)
  end) as Marks2
from numbers
group by Marks1;
  

Пример вывода —
ТАБЛИЦА

Ash 56 45

Дэвид 45 35

Вывод —

56 35

Поскольку 56 45 = 101 нечетное число, выведите 56 (максимальное число). В то время как в столбце marks2 45 35 = 80, четное число, поэтому выводите 35 (минимальное число).

Кто-нибудь может сказать мне, что с этим не так? Заранее спасибо.

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

1. Пожалуйста, предоставьте образцы данных и желаемые результаты. Не совсем ясно, чего вы пытаетесь достичь.

2. Пожалуйста, добавьте некоторые примеры данных и желаемый результат

3. в выходной таблице нет столбца ‘name’. игнорируйте команду group by, если хотите.

4. @Shinichi Затем удалите group by, а также marks1 и marks2 из select

5. Ваше заявление о проблеме и результаты не совпадают. В вашей постановке задачи вы хотите использовать min() в случае нечетного, но в ваших примерах результатов вы используете max() в случае нечетного.

Ответ №1:

Используйте CTE, чтобы получить ваши значения min() , max() и sum() . Затем используйте case , чтобы определить, какие значения отображать.

Поскольку ваше заявление о проблеме и примеры результатов не совпадают, я последовал за вашими примерами результатов, чтобы вернуть max() нечетное sum() значение. Вы можете переключить это, изменив два case оператора с 1 на 0 .

Рабочая скрипка

 with totals as (
  select sum(marks1) as marks1sum,
         min(marks1) as marks1min,
         max(marks1) as marks1max,
         sum(marks2) as marks2sum,
         min(marks2) as marks2min,
         max(marks2) as marks2max
    from numbers
)
select case mod(marks1sum, 2)
         when 1 then marks1max
         else marks1min
       end as marks1,
       case mod(marks2sum, 2)
         when 1 then marks2max
         else marks2min
       end as marks2
  from totals;
  

Ответ №2:

Вы повторно используете метки 1 и метки 2 при сглаживании третьего и четвертого столбцов, которые сталкиваются. Попробуйте использовать другое имя.

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

1. Я думаю, вы неправильно поняли вопрос. Пожалуйста, внимательно прочитайте это.