Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
 Аватар для PhantomSoft
8 / 5 / 3
Регистрация: 11.03.2015
Сообщений: 94

Запрос с несколькими условиями

13.03.2018, 23:33. Показов 5786. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, специалисты! Помогите, пожалуйста, составить sql-запрос.
Дано: две таблицы
1) клиенты clients (id, workstatus): идентификатор клиента и его статус
2) платежи payments (id, client, pay_group, summa): идентификатор платежа, клиент, которому принадлежит платеж, группа платежей, сумма
все поля целые (сумма - вещественная). Связаны таблицы так: payments.client->clients.id
Балансом по группе G для клиента C назовём сумму по полю summa всех платежей, у которых client=C и pay_group=G

Надо: выбрать id всех клиентов, у которых:
workstatus=1 и баланс по группе 1 меньше 100 и баланс по группе 6 меньше 0
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.03.2018, 23:33
Ответы с готовыми решениями:

Выполнить запрос с несколькими условиями
Здравствуйте. Подскажите пожалуйста почему не хочет работать вот такой код: $strSQL = "SELECT * FROM baza WHERE srok...

Удаляются не уникальные данные при выборке из таблицы с несколькими условиями используя оператор OR
SELECT * FROM `table` WHERE `id`= 1 OR `id`= 2 OR `id`= 3 OR `id`= 3 OR `id`= 4; Подскажите как можно получить...

Запрос с условиями
Здравствуйте! Пишу админку для галереи. Всё работает...но хотелось бы сделать всё работало красиво В общем есть 2 таблица в базе, одна...

8
8 / 8 / 3
Регистрация: 06.12.2013
Сообщений: 200
14.03.2018, 01:28
Попробуйте так, хотя я не на 100% уверен...

Oracle 11 SQL Скопировано
1
SELECT `clients`.`id` FROM `clients` INNER JOIN `payments` ON `payments`.`client` = `clients`.`id` WHERE (`pay_group` = 1 AND `summa` < 100) OR (`pay_group` = 6 AND `summa` < 0)
1
1 / 1 / 1
Регистрация: 14.03.2018
Сообщений: 3
14.03.2018, 02:14
Можно так, если по простому без подзапросов и ...
PHP Скопировано
1
SELECT id, pay_group, summa FROM payments WHERE (pay_group = 1 AND summa < 100) OR (pay_group = 6 AND summa < 0);
1
 Аватар для PhantomSoft
8 / 5 / 3
Регистрация: 11.03.2015
Сообщений: 94
14.03.2018, 02:20  [ТС]
М_Сергей, Vlad-Troshin, спасибо, что не прошли мимо, но вы не учитываете того, что в запросе должна сравниваться сумма по полю summa, а не само это поле. А также, если условие1 И условие2 (у вас OR, т.е. ИЛИ).
Наверное, надо как-то select в selectе использовать, или having.
0
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
14.03.2018, 09:30
Лучший ответ Сообщение было отмечено PhantomSoft как решение

Решение

На вскидку, так. Могут быть ошибки в синтаксисе ибо не проверял
SQL Скопировано
1
2
3
4
5
SELECT * FROM 
(SELECT client, SUM(summa) AS t FROM payments t WHERE pay_group =1 GROUP BY client HAVING t < 100) one
INNER JOIN
(SELECT client, SUM(summa) AS r FROM payments WHERE pay_group = 6 GROUP BY client HAVING r < 0) six
ON one.client = six.client
Надо бы еще с первой таблицей соединить, но думаю сами догадаетесь.
1
8 / 8 / 3
Регистрация: 06.12.2013
Сообщений: 200
14.03.2018, 14:44
Oracle 11 SQL Скопировано
1
SELECT `clients`.`id` FROM `clients` INNER JOIN `payments` ON `payments`.`client` = `clients`.`id` WHERE (`workstatus` = 1 AND `pay_group` = 1 AND `summa` < 100) OR (`workstatus` = 1 AND  `pay_group` = 6 AND `summa` < 0)
Я про workstatus вообще забыл... Громоздко конечно, но может заработает... Условие "ИЛИ" нужно понимать что в выборку будет попадать каждая строка котороая будет удовлетворять любому из 2-х условий.

И еще, здесь нет ошибки? Условие `summa` < 100 означает диапазон от всей отрицательной зоны чисел до 100 (не включая), а условие `summa` < 0 - только отрицательная зона, т.е для обоих условий удовлетворяется отрицательная зона чисел. Или же в 1-ой группе в приципе отрицательных summa не бывает?
0
 Аватар для PhantomSoft
8 / 5 / 3
Регистрация: 11.03.2015
Сообщений: 94
14.03.2018, 14:52  [ТС]
М_Сергей, вы опять пытаетесь сравнить 100 и 0 с полем summa, а нужно сравнивать с суммой (по полю summa) всех платежей, у которых pay_group=1 и pay_group=0 соответственно.

Ошибки нет. Там вообще все параметры задаются пользователем.
0
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
14.03.2018, 15:09
М_Сергей, насколько я понял задание пользователь может по нескольку раз находится в разных группах вы же пишите условие или в перовой или в 6. Собственно потому я в своем пример и выделил отдельно таблицу с пользователями первой группы, отдельно с 6 и потом вывел пересечение. И summa это сумма платежа одного, а их несколько.. в разных группах..., ну вы поняли=D
PhantomSoft, по тому, запросу который я предлагал, есть какие-то замечания дополнения?
1
 Аватар для PhantomSoft
8 / 5 / 3
Регистрация: 11.03.2015
Сообщений: 94
14.03.2018, 15:32  [ТС]
Корд, у вас во второй строке лишний алиас t (но это мелочи).
Для меня главной задачей было понять, как построить эти запросы, как связать их в один и как размножать эти условия (количество и параметры для этих условий задаются пользователем и наперёд не известны).
Вот окончательный вариант, с учётом статуса клиента и третьим дополнительным условием:
SQL Скопировано
1
2
3
4
5
6
SELECT d.`id`
FROM `clients` d
JOIN (SELECT `client`, SUM(SUM) AS r FROM `payments` WHERE `pay_group` = 1 GROUP BY `client` HAVING r < 100) alias1 ON d.`id` = alias1.`client`
JOIN (SELECT `client`, SUM(SUM) AS r FROM `payments` WHERE `pay_group` = 6 GROUP BY `client` HAVING r < 0  ) alias2 ON d.`id` = alias2.`client`
JOIN (SELECT `client`, SUM(SUM) AS r FROM `payments` WHERE `pay_group` = 4 GROUP BY `client` HAVING r > 150) alias3 ON d.`id` = alias3.`client`
WHERE d.`workstatus`=1
Насколько я помню, вместо INNER JOIN можно просто JOIN.
Спасибо всем откликнувшимся!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.03.2018, 15:32
Помогаю со студенческими работами здесь

SQL запрос для поиска значений с 2-мя условиями
Задача: найти значение поля status по наибольшей дате(idate) для каждого (уникального) договора (id_dogovor) Таблица вида: ...

Запрос работающий с несколькими таблицами
Нужно разобраться как делать запрос связывающий несколько таблиц. Я вычитал что это делает JOIN, но сделать не получается. Вот например...

SQL запрос с несколькими переменными
Помогите составить запрос SELECT Таблица.поле1, Таблица.поле2, Таблица.поле3 From Таблица WHERE Таблица.поле1 = :p1 AND...

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

Запрос к БД с несколькими условиями
Здравствуйте как реализовать правильно следующий запрос? Мне необходимо чтобы если в Таблице Автомобили Марка_автомобиля=x и...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
Агрегаты и сущности в DDD микросервисах
Javaican 10.04.2025
Разработка современных программных систем часто приводит на распутье: монолит или микросервисы? Даже при выборе микросервисной архитектуры многие команды сталкиваются с проблемой правильного. . .
Многопоточность в C#: Task и параллельное программирование
UnmanagedCoder 10.04.2025
Современные процессоры уже давно перестали наращивать тактовую частоту в пользу увеличения количества ядер. Это создало интересную ситуацию: разработчики, привыкшие к последовательному. . .
Линейное решение нелинейной задачи будет иметь приблизительный результат вычисления для метода обработки данных из double buffering.
Hrethgir 10.04.2025
Вообще изначально я пренебрёг квадратурой числа, но потом понял, что для вычисления приблизительного значения - сгодится, формулу можно будет корректировать по ходу. Это потому что прямое соотношение. . .
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
Vue SFC компонент на PHP с Fusion
Jason-Webb 09.04.2025
PHP на сервере и JavaScript на клиенте — классическое сочетание, которое, несмотря на свою эффективность, создает определенный когнитивный диссонанс при разработке. В этом контексте появляются. . .
TypeScript vs JavaScript: Отличия и когда что использовать
Reangularity 09.04.2025
JavaScript появился в 1995 году как творение Брендана Эйха и быстро стал основой интерактивности в вебе. За свою историю он прошел путь от простого языка для манипуляций с DOM до полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер