powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Group by + case?
4 сообщений из 4, страница 1 из 1
Group by + case?
    #40048832
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, подскажите пожалуйста - возможно вопрос легкий, но что-то не могу сообразить.
Надо сделать group by по первому полю. При этом по предпоследнему суммировать - это понятно sum
А вот по последнему полю нужно реализовать условие в зависимости от значения предпоследнего -
выбрать строку с максимальным значением и в зависимости от этого выбрать значение последнего поля.
То есть в данном случае так как 110 > 18, то соответственно 1, но могло бы быть 0,
Нужный мне результат представлен ниже на скрине (сейчас выбирается как max(поле) что не есть верно).
Теперь вопрос - как добиться нужного результата по возможноcсти без подзапросов?

Попробовал case, но не прокатило или я не могу додуматься как его правильно тут применить
Код: plsql
1.
(case when salesvalue/sum(salesvalue) >= 0.5 then cash else abs(cash - 1) end)



П.С. Строк с одинаковым значение по первому полю может быть максимум 2
...
Рейтинг: 0 / 0
Group by + case?
    #40048860
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
арт2010
П.С. Строк с одинаковым значение по первому полю может быть максимум 2

Если не больше двух, то можно и так:
Код: sql
1.
2.
3.
4.
SELECT первое_поле, sum(предпоследнее_поле),
       (array_agg(последнее_поле ORDER BY предпоследнее_поле DESC))[1]
FROM   таблица
GROUP BY первое_поле;
...
Рейтинг: 0 / 0
Group by + case?
    #40049085
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для общего случая (только не понятно как быть, если для одного f1 будет 2-а одинаковых f2)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with cte (f1,f2,f3) as (
	select '001012042600004',18,0 union all
	select '001012042600004',110,1 union all
	select '001012042600004',111,0 union all
	select '001012042600004',112,1 union all
	select '001012042600003',126,0
),
cte1 as (
	select f1, f2, case when max(f2)over(partition by f1) = f2 then f3 end as f3
    from cte
) 
select 
	f1
    ,sum(f2) as sum_f2
    ,max(f3) as f3
from cte1
group by 
	f1
...
Рейтинг: 0 / 0
Group by + case?
    #40049175
арт2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов, благодарствую, вроде работает. Я правда свой вариант успел написать, но ваш быстрее
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Group by + case?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]