![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
Zahard |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.4.2013 Репутация: нет Всего: нет |
Есть БД общежития с таким участком:
![]() Связь между pupil/payment, как и все остальные, 1:M, если кто не понял Есть 2 запроса: Вывести список месяцев с макс. задолженностью студентов по оплате. Здесь работа только с таблицей payment. Поле debt - задолженность. На текущим момент написал это: SELECT student_id, MAX(Debt) FROM payment GROUP BY student_id; Не понимаю как месяц и год сюда привязать. Второй запрос - список студентов, проживающих в общежитии с указанием комнаты, в которой живет, и произведенной оплатой за последний месяц. На данный момент меня хватило на это: SELECT DISTINCT pup.student_id, hl.hostel_id, hl.room_id, pay.month_residence, pay.contribution_paid FROM payment pay JOIN pupil pup ON pay.student_id=pup.student_id JOIN hostel_live hl ON pup.student_id=hl.student_id JOIN edu_form ef ON pup.form_id=ef.form_id WHERE ef.status='Студент'; Не понимаю как по последнему месяцу вывести и почему DISTINCT не работает. Нужна помощь ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Блин, ты даже разхдел по Ораклу http://forum.vingrad.ru/forum/oracle-database.html найти на форуме не можешь, куда тебе запросами заниматься...
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Вам сказано ранжировать месяца по задолженности а вы готовите аналитику в разрезе студентов ![]() rtfm first/last так то а зачем тогда "Составление SQL-запросов"? ![]() Это же не вопрос про ораклеспецифид плюхам. По мне так, вполне нормально выбран раздел. И указание платформы - не лишее. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
ИМХО для вопросов, которые не связаны с конкретной СУБД и конкретным языком. Т.е. для случаев, когда гарантированно не могут использоваться особенности и фичи СУБД, и требуется полное соответствие минимальному стандарту и работоспособность на любой СУБД (с точностью до скобок и кавычек). -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Akina, если бы вопрос был как захерачить скрипт для sql*plus или как инициализировать PL/SQL колллекцию - тут ясно, что вопрос специфичен для платформы. Вопрос же заданный ТС вполне может быть решен ансишными средствами, здесь может оказаться полезным опыт и акцессса и маси, ровно как и ответ может быть полезным не только для завязавшихся на платформу оракакла
-------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Zloxa, в первом запросе ему требуется вывод максимальной записи для группы, во-втором - последней. В каждой СУБД это будет делаться по-своему - ибо ансишный вариант страхолюден и тормозлив.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Именно по этой причине я сказал, что упоминание платформы не лишнее. Как по твоему, ТС, мог на этапе публикации поста определить - имеет ли решение его задачи платформозависимость? -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
По-моему, он обязан был не исключать такую возможность. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zahard |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.4.2013 Репутация: нет Всего: нет |
Если тематика разделов форума насктолько сильно пересекается, что решение написать пост по SQL-запросам в разделе SQL-запросов ошибочна, то это точно проблема организации этого форума, а не моя. Я же все сделал правильно.
|
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
Используй полученную выборку как условие отбора по другой копии исходной таблицы. Например. Кстати, а что тебе надо сделать, если у кого-то одинаковая, и в то же время максимальная, сумма задолженности встречается несколько раз в разных месяцах? Что такое "последний месяц"? Месяц последнего платежа? последний месяц, за который уплачено? что-то ещё? Он работает. Только ты, вероятно, не понимаешь, что он делает - а потому и не видишь, что он работает. Оставайся при своём мнении. Впрочем, это ни на что не влияет - просто это ты потерял нескольких потенциальных отвечающих, а остальным с того ни холодно, ни жарко. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zahard |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.4.2013 Репутация: нет Всего: нет |
Этот момент не оговаривается. По хорошему надо чтобы оба таких месяца были выведены.
Тут все просто, если для студента есть запись в hostel_live, то с наступлением нового месяца запись для него автоматически создается в payment. Т.е. это последний месяц проживания, за который надо внести оплату.
Отсеивает повторяющиеся записи? Мне нужно отсеить повторяющие по полю student_id если точнее. Это сообщение отредактировал(а) Zahard - 20.5.2013, 17:06 |
||||||
|
|||||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
В таком случае предложенный мной метод даст верные результаты. Эээ... раньше было совсем другое, а именно "произведенной оплатой за последний месяц". Произведённая - это однозначно УЖЕ выполненная. Без вариантов. А теперь ты говоришь о планируемой сумме оплаты, с учётом накопленного долга/переплаты и безотносительно фактического платежа. Кстати, а вендь за один календарный месяц может пройти и не один платёж - студенты, они такие... что в таком случае делать? причём и к первому вопросу это тоже относится...
DISTINCT отсеивает ПОЛНЫЕ дубликаты. По ВСЕМ полям записи. Если хоть в одном поле несовпадение - это несовпадающие записи, и DISTINCT-у там делать нечего. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zahard |
|
||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.4.2013 Репутация: нет Всего: нет |
Формулировка может не совсем корректная. В payment указываются НЕОБХОДИМЫЕ платежи, те что были и те что еще должны произойти если debt>0.
Ответственность за подсчет числа платежей в месяц лежит на других таблицах, в payment заносится суммарная информация по платежам. |
||||
|
|||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
![]() -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Zahard |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 28.4.2013 Репутация: нет Всего: нет |
В общем, по прошествии времени, мой неокрепший в SQL запросах мозг выдал такие запросы:
1й запрос: SELECT month_residence, SUM(debt) "Задолженность" FROM payment GROUP BY month_residence HAVING SUM(debt)=(SELECT MAX(X1) FROM (SELECT SUM(debt) "X1" FROM payment GROUP BY month_residence)); 2й запрос: SELECT DISTINCT pup.student_id, hl.hostel_id, hl.room_id, MAX(pay.month_residence) KEEP (DENSE_RANK LAST ORDER BY (pay.month_residence)) OVER (PARTITION BY pup.student_id) "Последний месяц", MAX (pay.contribution_paid) KEEP (DENSE_RANK LAST ORDER BY (pay.month_residence)) OVER (PARTITION BY pup.student_id) "Оплата" FROM payment pay JOIN pupil pup ON pay.student_id=pup.student_id JOIN hostel_live hl ON pup.student_id=hl.student_id; Правда во втором запросе у меня есть сомнения (нехеровые такие, сомнения) по поводу 5й строки "Оплата". Оцените плз, эксперты. Это сообщение отредактировал(а) Zahard - 27.5.2013, 19:48 |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |