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

Откуда:
Сообщений: 14
Есть таблица в которой поля это
ТОВАР
ДАТА ПРИВОЗА
КОЛИЧЕСТВО
Задача: Необходимо вычислять дату, состоянием на которую определенного товара было заданное количество.
USE tempdb;
GO
--словарь товаров
if OBJECT_ID('tempdb.#voc01', 'U') IS NOT NULL
 DROP TABLE tempdb.#voc01
GO
CREATE TABLE #voc01(ID int IDENTITY(1,1),NAME nvarchar(100));
INSERT INTO #voc01 (NAME) VALUES ('МОЛОКО'), ('КЕФИР'), ('СМЕТАНА')
-- таблица приходов
if OBJECT_ID('tempdb.#tab01', 'U') IS NOT NULL
 DROP TABLE tempdb.#tab01
GO
CREATE TABLE #tab01(ID int IDENTITY(1,1), D datetime, GOODS int, AMOUNT int);
INSERT INTO #tab01 (D, GOODS, AMOUNT) VALUES 
 ('01.01.2015', 1, 100)
,('01.01.2015', 3, 100)
,('15.01.2015', 2, 100)
,('25.01.2015', 1, 100)
,('01.02.2015', 3, 100)
,('15.02.2015', 1, 100)
,('25.02.2015', 2, 100)
,('01.03.2015', 1, 100)
,('15.03.2015', 3, 100)
,('25.03.2015', 1, 100)
,('01.04.2015', 1, 100)
,('15.04.2015', 3, 100)
,('25.04.2015', 3, 100)
,('01.05.2015', 2, 100)
,('15.05.2015', 2, 100)
,('25.05.2015', 1, 100)

--общее количество товара
SELECT v.NAME, ISNULL(SUM(T.AMOUNT),0) AS AMOUNT 
FROM #tab01 T 
LEFT JOIN #voc01 v ON (T.GOODS = v.ID) 
GROUP BY v.NAME
--выбираем только приход по товару молоко
SELECT v.NAME, T.D, T.AMOUNT 
FROM #tab01 T
LEFT JOIN #voc01 v ON (T.GOODS = v.ID)
WHERE GOODS = 1


Ну к примеру какая была дата, когда МОЛОКА привезли 500 бутылок?
Если смотреть на последнюю таблицу - это 25.03.2015.


Вопрос: Как находить эту дату с помощью запросом?
14 янв 16, 21:05    [18680797]     Ответить | Цитировать Сообщить модератору
 Re: Поиск даты суммируя значение другого поля... (по другому не придумал как описать)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31778
SQL_begin
Вопрос: Как находить эту дату с помощью запросом?
Ищите в форуме по словам "накопительный итог"
14 янв 16, 21:22    [18680862]     Ответить | Цитировать Сообщить модератору
 Re: Поиск даты суммируя значение другого поля... (по другому не придумал как описать)  [new]
o-o
Guest
оптимальное решение сильно зависит от версии сервера, а вы ее не огласили
14 янв 16, 22:35    [18681111]     Ответить | Цитировать Сообщить модератору
 Re: Поиск даты суммируя значение другого поля... (по другому не придумал как описать)  [new]
SQL_begin
Member

Откуда:
Сообщений: 14
o-o
оптимальное решение сильно зависит от версии сервера, а вы ее не огласили

Microsoft SQL Server 2012 (SP1) - 11.0.3156.0 (X64)
May 4 2015 18:48:09
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
14 янв 16, 23:13    [18681259]     Ответить | Цитировать Сообщить модератору
 Re: Поиск даты суммируя значение другого поля... (по другому не придумал как описать)  [new]
o-o
Guest
хорошая версия.
в cte накопительный итог (running_sum),
с товарами соедините самостоятельно.

;with cte as
(
select d, goods, amount, 
  sum(amount) over(partition by goods 
                order by d 
                rows between unbounded preceding 
                         and current row) as running_sum                         
from #tab01
where goods = 1
)

select top 1 *
from cte
where running_sum >= 500
order by running_sum;
14 янв 16, 23:33    [18681334]     Ответить | Цитировать Сообщить модератору
 Re: Поиск даты суммируя значение другого поля... (по другому не придумал как описать)  [new]
SQL_begin
Member

Откуда:
Сообщений: 14
o-o
в cte накопительный итог (running_sum),
с товарами соедините самостоятельно.

Спасибо за помощь. Теперь сижу читаю про OVER, UNBOUNDED PRECEDING и т.д. Результат, тот который нужен, как получилось - не понял :D
15 янв 16, 00:41    [18681470]     Ответить | Цитировать Сообщить модератору
 Re: Поиск даты суммируя значение другого поля... (по другому не придумал как описать)  [new]
o-o
Guest
начните с просто накопительного итога.
решите суммированием всех с меньшей датой для каждой даты.
курсором и запросом.
потом осознайте, что в 2012ом, наконец, это реализовали,
а синтаксис вот такой.
вот хорошо описано:
Running Totals
15 янв 16, 01:05    [18681493]     Ответить | Цитировать Сообщить модератору
 Re: Поиск даты суммируя значение другого поля... (по другому не придумал как описать)  [new]
SQL_begin
Member

Откуда:
Сообщений: 14
o-o
начните с просто накопительного итога.
решите суммированием всех с меньшей датой для каждой даты.
курсором и запросом.
потом осознайте, что в 2012ом, наконец, это реализовали,
а синтаксис вот такой.
вот хорошо описано: Running Totals


Спасибо Вам огромное!
15 янв 16, 03:36    [18681545]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить