|
Модераторы: Akina |
|
ospts |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 15.8.2016 Репутация: нет Всего: нет |
Доброго времени суток!
Есть три таблицы CLIENTS, DEALS, PAYMENTS. В CLIENTS хранятся данные о клиентах, в DEALS хранятся данные о сделках, а в PAYMENTS хранятся оплаты по сделкам. Оплаты проходят ни полными суммами, а частями в течение некоторого времени. Мне требуется узнать, по каким сделкам прошли оплаты после даты сделки, и вывести или полную сумму сделки, если сумма оплат превышает сумму сделок либо равна ей, или же частично, если сумма оплат меньше суммы сделки. Я сделал вот такой запрос, вроде бы всё правильно.
Но есть один нюанс, есть клиенты, с которыми провели несколько сделок и нужно узнать, какие сделки уже закрыты, а какие ещё нет. Пример: Сумма оплат у Иванова с 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! Не понимаю, как можно связать разные сделки клиента между собой... Подскажите, как нужно изменить запрос, чтобы получился нужный результат?! Версия SQL 2008 |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Для ответа на этот вопрос НЕОБХОДИМО, чтобы в таблице оплат для каждой оплаты было указано, по какой сделке выполняется оплата. Если же речь идёт об идиотской схеме, когда подобных сведений в таблице оплат нет, а оплата тупо считается погашением по самой старой неоплаченной сделке (какой болван это строил? лучше бы сперва с бухгалтером посоветовался), то единственный выход - это для сделок и для платежей отдельно получить выборки с нарастающим по дате итогом суммы, а потом объединить их, используя в качестве базовой таблицы суммарную выборку всех дат из обеих выборок. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
ospts |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 15.8.2016 Репутация: нет Всего: нет |
К сожалению речь идёт о втором варианте...
Такую базу мы получаем уже готовую А можете поподробнее описать, а то я в SQL ещё не очень силён?! |
|||
|
||||
Akina |
|
||||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Соболезную...
Начальная схема у тебя будет приблизительно такая: Сперва тебе нужно получить для каждого клиента нарастающий итог по сделкам. Это будет выглядеть как-то типа
Аналогично получишь для каждого клиента нарастающий итог сумм оплаты. Затем получишь для каждого клиента суммарный список дат из обеих таблиц. Типа
К этому списку привязываешь обе полученные ранее выборки. В результате на каждую дату ты получаешь два значения - общая сумма сделок и общая сумма платежей. Т.е. фактически финансовую историю. Ну и получишь тупым вычитанием текущий баланс на каждую дату. Когда получишь этот результат - преобразуй его в более компактный. В нём много лишних данных. Тебе достаточно оставить для каждой сделки только одну запись - самую последнюю перед следующей сделкой. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
ospts |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 15.8.2016 Репутация: нет Всего: нет |
Спасибо, сейчас буду пробовать!
|
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Да, когда станешь привязывать обе выборки сумм к выборке дат, тебе нужно заполнить обе части. Посему ты используешь не LEFT JOIN (нафига тебе NULL-ы?), а декартово произведение с отбором по непревышению даты, и, группируя по дате из общего списка, берёшь максимальные дату и сумму из нарастающих итогов (они в выборках нарастающих сумм у тебя по определению должны монотонно расти).
Добавлено через 2 минуты и 20 секунд PS. Жаль, у тебя не 2012 сервер, там всё было бы в разы проще - оконными функциями. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
ospts |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 15.8.2016 Репутация: нет Всего: нет |
Не получается запрос для каждого клиента нарастающий итог по суммам оплаты.
Видимо потому, что оплата привязана к сумме сделки! |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Ну вообще-то некоторые товарищи давно должны были опубликовать DDL своих таблиц с пояснениями. А то ХШ, как назло, в ремонте... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
ospts |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 15.8.2016 Репутация: нет Всего: нет |
Прошу прощения! Я не то написал, не к сумме, а к дате сделки...
Добавлено через 11 минут и 1 секунду Вот структура Присоединённый файл ( Кол-во скачиваний: 2 ) Структура_и_данные_БД.txt 0,70 Kb |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Это хрень, а не структура. Публикуй CREATE TABLE своих таблиц. С FK и пояснениями, кто есть ху.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
ospts |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 15.8.2016 Репутация: нет Всего: нет |
Чаво-чаво?
Добавлено через 1 минуту и 46 секунд А можно сделать через цикл? Добавлено через 2 минуты и 37 секунд Пустить цикл по моей первоначальной выборке и в ней уже найти таких товарищей |
|||
|
||||
ospts |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 15.8.2016 Репутация: нет Всего: нет |
Таблица 1 (Было яблок)
Продукт Цвет Количество Яблоки Зеленые 4 Яблоки Красные 7 Таблица 2 (Гости) Продукт Гость Количество Яблоки Саша 1 Яблоки Олег 2 Яблоки Маша 5 Яблоки Валентин 3 Очень хочется получить Результат в виде таблицы: Таблица 3 (Кто каких яблок съел?) Продукт Гость Цвет Количество Яблоки Саша Зеленые 1 Яблоки Олег Зеленые 1 Яблоки Олег Красные 1 Яблоки Маша Зеленые 2 Яблоки Маша Красные 3 Яблоки Валентин Красные 3 Устроит любая комбинация Главное требование,чтобы результирующая таблица сходилась с первыми двумя
Мне посоветовали вот этот пример. Типа его можно переделать под мои условия, заменив людей на сделки, а яблоки на платежи. Но я хоть убей, не вижу сходства с моей задачей... Как считаете, можно это использовать? |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 453 |
Наверное... ведь если посоветовали, то не просто так... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
ospts |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 15.8.2016 Репутация: нет Всего: нет |
Не знаю! Я там не вижу ничего общего!
Я вот, что набросал:
На примере работает... |
|||
|
||||
Правила форума "MS SQL" | |
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MS SQL Server | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |