Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
 Аватар для Skorp24
52 / 50 / 26
Регистрация: 15.06.2009
Сообщений: 390

Группировка при сортировке join-таблицы по нескольким полям

10.10.2019, 20:30. Показов 3313. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

У меня есть две таблицы: rpackage (пакеты) и rtask (задачи). Для одного пакета может назначаться несколько задач. У таблицы пакетов есть поля-флаги состояния packageifixed, packageffixed. У таблицы задач есть поля packageid — идентификатор связанного пакета, taskstatus — состояние пакета (перечисление 0, 1, 2) и tasktime_admission — время выдачи задания.

Нужно отсортировать таблицу пакетов по сложной совокупности состояний. Так как один из критериев сортировки — наличие или отсутствие у пакета задач, я использую left outer join:

SQL
1
2
3
4
5
6
7
8
9
10
SELECT *
FROM rpackage LEFT OUTER JOIN rtask
    ON rpackage.packageid=rtask.packageid
ORDER BY CASE 
    WHEN packageifixed=0 THEN 1 
    WHEN packageffixed=0 AND (rtask.packageid IS NULL OR rtask.taskstatus=2) THEN 2
    WHEN packageffixed=0 AND rtask.taskstatus=0 THEN 3
    WHEN packageffixed=0 AND rtask.taskstatus=1 THEN 4
    WHEN packageffixed=1 THEN 5
    END
Проблема в том, что если у пакета два и более заданий, такой пакет в результирующей выборке будет дублироваться. Именно эту проблему я не могу решить. Пробую использовать group by:
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT packagename, packageifixed, packageffixed, taskstatus, MAX(tasktime_admission)
FROM rpackage LEFT OUTER JOIN rtask
    ON rpackage.packageid=rtask.packageid
GROUP BY rtask.packageid, packagename, packageifixed, packageffixed, taskstatus
ORDER BY CASE 
    WHEN packageifixed=0 THEN 1 
    WHEN packageffixed=0 AND (rtask.packageid IS NULL OR rtask.taskstatus=2) THEN 2
    WHEN packageffixed=0 AND rtask.taskstatus=0 THEN 3
    WHEN packageffixed=0 AND rtask.taskstatus=1 THEN 4
    WHEN packageffixed=1 THEN 5
    END
Это не помогает, а если из group by убирать поля, по которым я не хочу группировать, то будет ругаться, что в order by такие поля есть… В общем, буду очень благодарен за любую помощь. Мне бы хотелось, чтобы пакет с определённым packageid не повторялся дважды.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2019, 20:30
Ответы с готовыми решениями:

Join одной таблицы по нескольким полям другой таблицы
Здравствуйте! Интересует возможность следующего: Есть, например, такой справочник такого вида: Id |Name 1|Есть 2|Нет ...

LINQ и группировка по нескольким полям
Здравствуйте, Есть таблица с полями 5-ю полями "p1", "p2", "p3", "p4", "а". Нужно найти суммы поля "а" раздельно по всем...

Не выполняется группировка по нескольким полям
Есть таблица вида: id | name | result-1 | result-2 ---------------------- 1 | name-1 | 3 | 2 2 | name-2 | 1 | 5 3 | name-1 | 3 |...

3
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.10.2019, 21:02
Что делать, если у одного пакета несколько задач в разных состояниях?
0
 Аватар для Skorp24
52 / 50 / 26
Регистрация: 15.06.2009
Сообщений: 390
10.10.2019, 21:04  [ТС]
invm, учитывать только максимальную задачу по полю tasktime_admission.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.10.2019, 21:19
Лучший ответ Сообщение было отмечено Skorp24 как решение

Решение

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
with t as
(
 select
  packageid, taskstatus,
  row_number() over (partition by packageid order by tasktime_admission desc) as rn
 from
  rtask
)
select
 p.*
from
 rpackage p left join
 t on t.packageid = p.packageid and t.rn = 1
order by
 case 
    when p.packageifixed=0 then 1 
    when p.packageffixed=0 and isnull(t.taskstatus, 2) = 2 then 2
    when p.packageffixed=0 and t.taskstatus=0 then 3
    when p.packageffixed=0 and t.taskstatus=1 then 4
    when p.packageffixed=1 then 5
 end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.10.2019, 21:19
Помогаю со студенческими работами здесь

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

Выбор по нескольким полям таблицы
Всем привет! Вот такая вот задача у меня... Есть таблица (cents) вот такого вида: http://picone.ru/thumbs/20-aztdizrt.jpg И...

Сверить две таблицы по нескольким полям
Подскажите пожалуйста. Есть две таблицы. В каждой таблице есть поля Фамилия, Имя Отчество. Нужно выбрать из первой таблицы строки, в...

Как связать две таблицы по нескольким полям?
Нужно, что бы работала связь Master-Detail. Но связать таблицы можно только сразу по двум полям, т.к. только в паре получается уникальная ...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru