Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Вопрос-Ответ Новый топик    Ответить
 помогите составить запрос  [new]
Лекс99
Member

Откуда:
Сообщений: 6
Всем привет!

Помогите пожалуйста в написании запроса. Сделал маленькую БД, но с запросом мучаюсь уже второй день, так и не смог

Задача сформировать следующий запрос:

Список лиц, у которых есть и кредит и депозит, причем кредит больше депозита. Вывод: Клиент, сумма депозитов, сумма кредитов.

П.С. все проблемы из-за клиента №2, т.к. у него 2 депозита и 2 кредита.

К сообщению приложен файл. Размер - 13Kb


Сообщение было отредактировано: 18 май 21, 15:19
18 май 21, 15:26    [22323671]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Dima T
Member

Откуда:
Сообщений: 15796
Лекс99
П.С. все проблемы из-за клиента №2, т.к. у него 2 депозита и 2 кредита.

Сначала суммируй, потом сравнивай. Условие проверки перенеси из where в having
18 май 21, 15:29    [22323673]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Лекс99
Member

Откуда:
Сообщений: 6
Dima T,

select кредиты.Физик AS Клиент, депозиты.сумма AS Сумма_депозитов, кредиты.сумма AS Сумма_кредитов
from кредиты inner join депозиты on кредиты.Физик=депозиты.Физик

where депозиты.сумма in
(SELECT sum(сумма)
FROM депозиты
where сумма>0
group by Физик;)

and

кредиты.сумма in (
SELECT sum(сумма)
FROM кредиты
group by Физик;)

and кредиты.сумма > депозиты.сумма
;


Пропал 2 клиент

К сообщению приложен файл. Размер - 51Kb
18 май 21, 15:36    [22323676]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Dima T
Member

Откуда:
Сообщений: 15796
Сначала группировка и сумма. Подзапросы не нужны.
18 май 21, 15:56    [22323683]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Лекс99
Member

Откуда:
Сообщений: 6
Dima T,

вы не могли бы написать запрос? у меня при любых раскладах суммы 2 клиента отображаются неправильно
18 май 21, 16:45    [22323711]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
exp98
Member

Откуда:
Сообщений: 3008
Dima T, совсем уж добрых всегда любят.
18 май 21, 17:04    [22323737]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Лекс99
Member

Откуда:
Сообщений: 6
exp98,

если бы я не сидел над запросом почти 24 часа, то не написал бы на форум. я подключил пару знакомых, которые чуть лучше меня разбираются, но и те не могут сделать рабочий запрос. Ясен пень, я обращусь сюда, раз знаний на 3 головы не хватает
18 май 21, 17:25    [22323754]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Dima T
Member

Откуда:
Сообщений: 15796
Лекс99
exp98,

если бы я не сидел над запросом почти 24 часа, то не написал бы на форум. я подключил пару знакомых, которые чуть лучше меня разбираются, но и те не могут сделать рабочий запрос. Ясен пень, я обращусь сюда, раз знаний на 3 головы не хватает

Тут помогают понять проблему, если это неинтересно - форум работа.

https://www.sql.ru/forum/940953/posobie-dlya-studentov-i-shkolnikov
18 май 21, 18:07    [22323770]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7492
Перебивать данные с картинки лень. Приведите исходный набор в виде
with депозиты as (select .. union all
или хотя бы
create table ... insert into..
18 май 21, 18:08    [22323771]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
exp98
Member

Откуда:
Сообщений: 3008
Лекс99, всем некогда. Ты не первый, кто воспламеняется моментом. На этом можно было бы и закончить, но...
Перечти нижеследующий диалог со стороны третьего лица:
ВОПРОС
Помогите пожалуйста в написании запроса.
ОТВЕТ
Сначала суммируй, потом сравнивай. Условие проверки перенеси из where в having
ВОПРОС
Пропал 2 клиент
ОТВЕТ
Сначала группировка и сумма. Подзапросы не нужны.
ВОПРОС
вы не могли бы написать запрос?
Резюме? Начал "за здравие", окончил "за упокой". Откуда это?

И этим заканчивает каждый второй из вас:
ВОПРОС
написать запрос
18 май 21, 18:15    [22323775]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Лекс99
Member

Откуда:
Сообщений: 6
exp98,

Да, я понял. Извините, если мое поведение некорректно. Просто бомбит из-за того кол-ва времени, которое убил на этот запрос.
Вообще впервые в жизни зарегился на ай-ти форум, т.к. уже не знал что делать.

Извините, братцы. Буду дальше грызть гранит науки
18 май 21, 18:33    [22323792]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Лекс99
Member

Откуда:
Сообщений: 6
Вроде бы так, что скажете?

select cred.Физик AS Клиент, cred.credit_sum AS Сумма_Кредитов, depo.depo_sum AS Сумма_депозитов
from (select кредиты.Физик, sum(кредиты.сумма) as credit_sum
from кредиты
group by кредиты.Физик) as cred
inner join (select депозиты.Физик, sum(депозиты.сумма) as depo_sum
from депозиты
group by депозиты.Физик) as depo
ON cred.Физик=depo.Физик
WHERE cred.credit_sum>depo.depo_sum;
18 май 21, 22:21    [22323851]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Dima T
Member

Откуда:
Сообщений: 15796
Лекс99
Вроде бы так, что скажете?

select cred.Физик AS Клиент, cred.credit_sum AS Сумма_Кредитов, depo.depo_sum AS Сумма_депозитов
from (select кредиты.Физик, sum(кредиты.сумма) as credit_sum
from кредиты
group by кредиты.Физик) as cred
inner join (select депозиты.Физик, sum(депозиты.сумма) as depo_sum
from депозиты
group by депозиты.Физик) as depo
ON cred.Физик=depo.Физик
WHERE cred.credit_sum>depo.depo_sum;

Потянет, но есть небольшая ошибка: если у клиента нет депозитов, то он не попадет в выборку. Думай как поправить.

PS Обычно в выборке участвует родительская таблица, в данном случае справочник клиентов. С ним можно было бы короче написать:
select Клиенты.Физик AS Клиент, sum(кредиты.сумма) as credit_sum, sum(депозиты.сумма) as depo_sum
   from клиенты 
            inner join кредиты on клиенты.Физик = кредиты.Физик 
            inner join депозиты on клиенты.Физик = депозиты.Физик
   group by клиенты.Физик
   having credit_sum > depo_sum
19 май 21, 07:31    [22323929]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
Dima T,

Можно и без. Одолжу вашу заготовку:

select Физик
   from кредиты 
   full outer join депозиты using(Физик)
   group by Физик
   having sum(кредиты.сумма) > 
          sum(депозиты.сумма)
19 май 21, 08:26    [22323944]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Dima T
Member

Откуда:
Сообщений: 15796
НеофитSQL
Dima T,

Можно и без.

Затести клиента у которого 2 кредита и 2 депозита.
19 май 21, 08:28    [22323945]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
Dima T,

Aaaa точно, это я лихо размахнулся,а физики тут не PK. Пардон, тут физики повторяются,другой случай.
Набрали, понимаешь, кредитов..

select Физик from (
   select Физик, -сумма from кредиты 
        union all
   select Физик, +сумма from депозиты 
   )
   group by Физик
   having sum(сумма) < 0
19 май 21, 08:42    [22323950]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7492
Лекс99
у которых есть и кредит и депозит, причем кредит больше депозита. Вывод: Клиент, сумма депозитов, сумма кредитов.



НеофитSQL,

Затести клиента без депозита
19 май 21, 11:15    [22324056]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
env
Лекс99
у которых есть и кредит и депозит, причем кредит больше депозита. Вывод: Клиент, сумма депозитов, сумма кредитов.



НеофитSQL,

Затести клиента без депозита


Затестил, работает норм.
env, что у вас не получилось?

with credits(person,amount) as (
  select 1, 100 from dual  union all
  select 2, 200 from dual  union all
  select 4, 400 from dual
),
debits(person, amount) as (
  select 2, 2000 from dual  union all
  select 3, 3000 from dual  union all
  select 4, 40   from dual
)
select person from (
   select person, -amount as amount from credits
        union all
   select person, +amount from debits
   )
   group by person
   having sum(amount) < 0
19 май 21, 15:54    [22324266]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7492
НеофитSQL
работает норм.


А в итоговой выборке его быть не должно.
19 май 21, 17:18    [22324325]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
env,

точно. я вчера невнимательно прочитал условия задачи.
Там было сказано только показывать тех, у кого есть и кредит, и депозит.

Тогда решение совсем по-другому выглядит, как стихи Маяковского:

with credits(person,amount) as (
  select 1, 100 from dual  union all
  select 2, 200 from dual  union all
  select 4, 400 from dual
),
debits(person, amount) as (
  select 2, 2000 from dual  union all
  select 3, 3000 from dual  union all
  select 4, 40   from dual
)
select * from 
  (select person, sum(amount) as allcredits
     from credits
    group by person
  )
  join
  (select person, sum(amount) as alldebits
     from debits
    group by person
  ) using (person)
 where allcredits > alldebits
19 май 21, 17:28    [22324331]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Dima T
Member

Откуда:
Сообщений: 15796
НеофитSQL, молодец, повторил решение ТСа 22323851 читай дальше почему оно неправильное.

И хватит студентам готовые решения подсовывать, их учат думать, а не на форумах ответы искать.
19 май 21, 17:39    [22324341]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
Dima T
НеофитSQL, молодец, повторил решение ТСа 22323851 читай дальше почему оно неправильное.

И хватит студентам готовые решения подсовывать, их учат думать, а не на форумах ответы искать.


Я сам на правах студента :) На моих ответах далеко не уедешь.

Про "почему неправильное" непонятно.

ТС> Список лиц, у которых есть и кредит и депозит, причем кредит больше депозита

DT> Потянет, но есть небольшая ошибка: если у клиента нет депозитов, то он не попадет в выборку.

Кредит за глазастость у env: он первый заметил что мы все поначалу решали не ту задачу.
19 май 21, 18:21    [22324357]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос  [new]
Dima T
Member

Откуда:
Сообщений: 15796
НеофитSQL
Я сам на правах студента :) На моих ответах далеко не уедешь.

Научись делать тестовые данные. Всего 9 вариантов в данном случае
КлиентДепозитовКредитов
100
201
302
410
511
612
720
821
922
19 май 21, 20:04    [22324410]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить