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

Откуда: Днепропетровск
Сообщений: 52
Есть таблица:
Ост. Кол-во
3 2
3 2
3 1
1 1
1 3
4 2
4 1
4 1
ORDER BY Ост., Кол-во DESC

Возможно ли средствами SQL сделать следующее.

Представляем, что у нас три таракана, одна жаба и 4 велосипеда (первое поле). Во втором поле поставки тараканов (два раза по два), жаб (один раз одну), и велосипедов (три раза по два, одному, одному соответственно).

Задача: оставить последние поставки, которых хватит покрыть наличие. Например, таракана три - в последней поставке было два таракана. Этого мало, берем предыдущую поставку. Там еще два - этого хватит. Жаба одна и в последней поставке была одна, значит показать достаточно первую строку. Велосипедов четыре - надо все три последние поставки.

Надо получить:
Ост. Кол-во
3 2
3 2
1 1
4 2
4 1
4 1

PS: задача не выдуманная :), спасибо.
24 ноя 11, 19:25    [11654579]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
vkucherov
Представляем, что у нас три таракана, одна жаба и 4 велосипеда (первое поле)
где??? не вижу!
24 ноя 11, 19:27    [11654596]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
как минимум где -то должно быть количество проданных жаб,тараканов ..етц... сложно зделать складское движение и расчет необходимых поставок/запасов имея только кредитовую часть..... должна быть еще и дебетовая.... иначе ниче путевого у вас не выйдет.... Да и время попадания товара на склад надо... что понять что у вас первая поставка
24 ноя 11, 19:32    [11654631]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
vkucherov
Member

Откуда: Днепропетровск
Сообщений: 52
Неверно описал...
Во втором поле поставки тараканов (два раза по два И ОДИН РАЗ ОДИН), жаб (один раз одну И ОДИН РАЗ ТРИ), и велосипедов (ОДИН РАЗ ДВА И ДВА РАЗА ПО ОДНОМУ).
24 ноя 11, 19:32    [11654634]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
vkucherov
Member

Откуда: Днепропетровск
Сообщений: 52
Maxx
как минимум где -то должно быть количество проданных жаб,тараканов ..етц... сложно зделать складское движение и расчет необходимых поставок/запасов имея только кредитовую часть..... должна быть еще и дебетовая.... иначе ниче путевого у вас не выйдет.... Да и время попадания товара на склад надо... что понять что у вас первая поставка

Время есть! Я и сортировку неверно тут описал...
ORDER BY Ост., ВРЕМЯ ПОСТАВКИ DESC
24 ноя 11, 19:34    [11654644]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Упс - не дочитал..канечно с консерваторие бардак - но время надо полюбому,иначе как определить "послденюю" поставку то ?
24 ноя 11, 19:34    [11654646]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
FAQ
24 ноя 11, 19:35    [11654658]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
vkucherov
Member

Откуда: Днепропетровск
Сообщений: 52
Maxx
Упс - не дочитал..канечно с консерваторие бардак - но время надо полюбому,иначе как определить "послденюю" поставку то ?
Время есть! Я не все столбцы указал. Поле со временем поставки есть.
24 ноя 11, 19:35    [11654659]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
vkucherov
Member

Откуда: Днепропетровск
Сообщений: 52
Maxx
FAQ

Спасибо, прочел, попробовал - там все ясно, но мне кажется, что это не совсем то, что мне нужно.
У меня нет продаж и уже есть текущий остаток. И надо показать такое количество приходных накладных, которое покроет этот остаток. Начиная с последней.
24 ноя 11, 19:45    [11654722]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну идея то такаяже...там есть еще статья - Нарастающий итог,вам надо тоже самое ,только в обратном порядке...
как варинт 2 сте - один с фиксироваными значениями,второй сте - ето просто джой с первым по товару и расчет нужной суммы....посмотрите в ету сторону,думаю у вас все получиться
24 ноя 11, 19:48    [11654735]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
fabulaspb
Member

Откуда: Санкт-Петербург
Сообщений: 34
Нужны доп. столбцы:
goods_id - идентификатор товара
timestamp - время доставки нового товара на склад

Логика запроса следующая:
1. Группа записей с одинаковым идентификатором товара нумеруется согласно дате поставки товара по убыванию.
2. Для каждого товара, в подзапросе подсчитываем сумму количества товаров для дат поставки меньше либо равной дате текущей записи (накопительный итог)
3. Находим записи, где сумма поставок покрывает наличие
4. Извлекаем запись с максимальным временем поставки.
5. Оставляем только те записи в исходной таблице, где время поставки больше либо равно времени из п.4

WITH num_tbl AS(
SELECT goods_id, goods_qty, new_goods_qty, row_number() over(partition by goods_id order by timestamp DESC) as row_num
FROM tbl_name as tbl2)
SELECT * FROM tbl_name
JOIN
  (SELECT goods_id, max_time, timestamp FROM
   (SELECT *, MAX(timestamp) over(partition by goods_id) as max_time FROM
      (SELECT goods_qty, new_goods_qty, timestamp,
         (SELECT SUM(new_goods_qty) FROM num_tbl WHERE row_num <= tbl2.row_num AND goods_id = tbl2.goods_id) as sum_del
       FROM num_tbl as tbl2
      ) as tmp
    WHERE sum_del >= goods_qty
   ) as tmp2 WHERE timestamp = max_time) as tmp3 
ON tbl_name.goods_id = tmp3.goods_id AND tbl_name.timestamp >= tmp3.max_time
24 ноя 11, 20:29    [11654885]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
vkucherov
Member

Откуда: Днепропетровск
Сообщений: 52
fabulaspb
Нужны доп. столбцы:
goods_id - идентификатор товара
timestamp - время доставки нового товара на склад

Логика запроса следующая:
1. Группа записей с одинаковым идентификатором товара нумеруется согласно дате поставки товара по убыванию.
2. Для каждого товара, в подзапросе подсчитываем сумму количества товаров для дат поставки меньше либо равной дате текущей записи (накопительный итог)
3. Находим записи, где сумма поставок покрывает наличие
4. Извлекаем запись с максимальным временем поставки.
5. Оставляем только те записи в исходной таблице, где время поставки больше либо равно времени из п.4

WITH num_tbl AS(
SELECT goods_id, goods_qty, new_goods_qty, row_number() over(partition by goods_id order by timestamp DESC) as row_num
FROM tbl_name as tbl2)
SELECT * FROM tbl_name
JOIN
  (SELECT goods_id, max_time, timestamp FROM
   (SELECT *, MAX(timestamp) over(partition by goods_id) as max_time FROM
      (SELECT goods_qty, new_goods_qty, timestamp,
         (SELECT SUM(new_goods_qty) FROM num_tbl WHERE row_num <= tbl2.row_num AND goods_id = tbl2.goods_id) as sum_del
       FROM num_tbl as tbl2
      ) as tmp
    WHERE sum_del >= goods_qty
   ) as tmp2 WHERE timestamp = max_time) as tmp3 
ON tbl_name.goods_id = tmp3.goods_id AND tbl_name.timestamp >= tmp3.max_time

Я очень долго курил Ваш пост, отлаживал и ... да Вы же гений! Спасибо огромное!
24 ноя 11, 23:18    [11655411]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
vkucherov
Member

Откуда: Днепропетровск
Сообщений: 52
fabulaspb,

мое восхищение! :)
25 ноя 11, 00:34    [11655612]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом  [new]
fabulaspb
Member

Откуда: Санкт-Петербург
Сообщений: 34
vkucherov,

Я рад, что смог вам помочь :)
25 ноя 11, 00:39    [11655623]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить