Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2016, 12:32   #1
ospts
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 13
По умолчанию Помогите разобраться с SQL-запросом

Доброго времени суток!

Есть три таблицы CLIENTS, DEALS, PAYMENTS. В CLIENTS хранятся данные о клиентах, в DEALS хранятся данные о сделках, а в PAYMENTS хранятся оплаты по сделкам. Оплаты проходят ни полными суммами, а частями в течение некоторого времени. Мне требуется узнать, по каким сделкам прошли оплаты после даты сделки, и вывести или полную сумму сделки, если сумма оплат превышает сумму сделок либо равна ей, или же частично, если сумма оплат меньше суммы сделки.

Я сделал вот такой запрос, вроде бы всё правильно.

Код:
SELECT CLIENTS.NAME, DEALS.DATA, DEALS.SUMMA,
SUMPLAT =
CASE
WHEN SUM(ISNULL(PAYMENTS.SUMMA,0)) >= DEALS.SUMMA
THEN DEALS.SUMMA
ELSE PAYMENTS.SUMMA
END
FROM CLIENTS
JOIN DEALS ON DEALS.ROW_ID = CLIENTS.ROW_ID
LEFT JOIN PAYMENTS ON PAYMENTS.ROW_ID = CLIENTS.ROW_ID AND PAYMENTS.DATA >= DEALS.DATA
GROUP BY CLIENTS.NAME, DEALS.DATA, DEALS.SUMMA
ORDER BY CLIENTS.NAME
Но есть один нюанс, есть клиенты, с которыми провели несколько сделок и нужно узнать, какие сделки уже закрыты, а какие ещё нет.
Пример:
Сумма оплат у Иванова с 01.05.2014 (дата сделки) по текущий момент равна 5000
Сумма оплат у Иванова с 01.02.2015 (дата сделки) по текущий момент равна 3000

Должен получиться следующий результат:
Клиент=Иванов И.И. / Сумма сделки=10000 / Дата сделки = 01.05.2014 / Оплата = 5000
Клиент=Иванов И.И. / Сумма сделки= 7000 / Дата сделки = 01.02.2015 / Оплата = 0

На вторую сделку должен прийти НОЛЬ, т.к. сумма всех оплат <= сумме сделки и 5000 идут в погашение первой сделки!

У меня получается:
Клиент=Иванов И.И. / Сумма сделки=10000 / Дата сделки = 01.05.2014 / Оплата = 5000
Клиент=Иванов И.И. / Сумма сделки= 7000 / Дата сделки = 01.02.2015 / Оплата = 5000

А должно было прийти оплат на вторую сделку НОЛЬ!

Второй пример:
Сумма всех оплат Петрова с 01.01.2014 (дата сделки) по текущий момент равна 11000
Сумма всех оплат Петрова с 01.01.2015 (дата сделки) по текущий момент равна 6000

Должен получиться следующий результат:
Клиент=Петров П.П. / Сумма сделки=8000 / Дата сделки = 01.01.2014 / Оплата = 8000
Клиент=Петров П.П. / Сумма сделки= 4000 / Дата сделки = 01.01.2015 / Оплата = 3000

На первую сделку пришло 8000, а на вторую 11000-8000=3000

У меня выходит вот что:
Клиент=Петров П.П. / Сумма сделки=8000 / Дата сделки = 01.01.2014 / Оплата = 8000
Клиент=Петров П.П. / Сумма сделки= 4000 / Дата сделки = 01.01.2015 / Оплата = 4000

Оплата по второй сделке должна быть равна 3000!

Не понимаю, как можно связать разные сделки клиента между собой...

Подскажите, как нужно изменить запрос, чтобы получился нужный результат?!

Последний раз редактировалось Аватар; 15.08.2016 в 14:12.
ospts вне форума Ответить с цитированием
Старый 15.08.2016, 12:44   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

В этой каше понять что то трудно, вы бы показали структуры и данные
come-on вне форума Ответить с цитированием
Старый 15.08.2016, 12:49   #3
ospts
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 13
По умолчанию

Вы имеете ввиду примеры таблиц?
ospts вне форума Ответить с цитированием
Старый 15.08.2016, 12:50   #4
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Имею ввиду то что написал.
come-on вне форума Ответить с цитированием
Старый 15.08.2016, 13:18   #5
ospts
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 13
По умолчанию

Вот смотрите
Вложения
Тип файла: xls Структура и данные БД.xls (28.0 Кб, 11 просмотров)
ospts вне форума Ответить с цитированием
Старый 15.08.2016, 13:31   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Платеж к клиенту привязан, а к сделке ни как? В приведенном запросе так.

ADD

И в приведенной структуре тоже
Конфетку с такой структуры не сделаешь
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 15.08.2016 в 13:35.
Аватар вне форума Ответить с цитированием
Старый 15.08.2016, 13:45   #7
ospts
Пользователь
 
Регистрация: 15.08.2016
Сообщений: 13
По умолчанию

Да, именно так! Платежи к сделкам не привязаны.
Оплаты покрывают сделки по старшинству...

БД я переделать не могу, т.к. мы её готовую каждый месяц получаем
ospts вне форума Ответить с цитированием
Старый 15.08.2016, 13:48   #8
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

одним запросом никак. ну или надо выдумывать всякие вложенные, цте и т.п.
нет учета "учтенных" оплат, т.е. сколько и для какой сделки

если сначала проскочить по оплатам и как-то (нарастающий итог может применить) их распихать по сделкам, то потом (сверху) уже простым запросом сгруппировать. это первое что в голову пришло ))

Последний раз редактировалось come-on; 15.08.2016 в 14:00.
come-on вне форума Ответить с цитированием
Старый 15.08.2016, 14:04   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Там заморишься вообще считать, если есть сделки с одной датой по клиенту. Если таковых нет, то высчитывать сумму сделок и платежей до даты сделки и сумму платежей начиная с даты сделки. Примерно так:
Код:
SELECT D1.ROW_ID,D1.DATA,
    (SELECT SUM(D2.SUMMA) FROM DEALS D2 WHERE D2.ROW_ID=D1.ROW_ID AND D2.DATA<D1.DATA) AS СуммаСделокДо,
    (SELECT SUM(P2.SUMMA) FROM PAYMENTS P2 WHERE P2.ROW_ID=D1.ROW_ID AND P2.DATA<D1.DATA) AS СуммаПлатежейДо
    (SELECT SUM(P3.SUMMA) FROM PAYMENTS P3 WHERE P3.ROW_ID=D1.ROW_ID AND P3.DATA>=D1.DATA) AS СуммаПлатежейПосле
  FROM DEALS D1
На основании этого и городить результирующую выборку
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.08.2016, 14:13   #10
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
если есть сделки с одной датой по клиенту
это пол беды, а если сумма оплаты по частям разбивается, т.е. не вся сумма оплаты на сделку легла а только часть, а другая часть на следующую? простыми SUM это не обходится
come-on вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с SQL запросом. Mat Bourn Помощь студентам 15 21.05.2015 20:51
Не могу разобраться с SQL запросом точнее с конструкцией if then else Pykhov БД в Delphi 15 27.08.2013 09:56
Помогите с SQL-запросом! lordaleksej БД в Delphi 2 03.12.2009 22:55
Помогите разобраться с запросом IgorBol Microsoft Office Access 2 06.10.2009 17:19
Помогите разобраться с SQL-запросом MasterofCDM БД в Delphi 5 04.07.2008 13:42