#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. Я думаю, вы неправильно поняли вопрос. Пожалуйста, внимательно прочитайте это.