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

Откуда:
Сообщений: 5
Добрый день, подскажите как решить задачу,пожалуйста!
Я только начал пользоваться SQL, буду очень признателен за помощь.
Есть таблица содержащая остаток товаров в магазинах каждое первое число месяца( у этих строк признак 1) и в ней же все движение по датам (+ и -) (у этих строк признак 0) , нужно получить таблицу с остатком на каждый день.

Спасибо!

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


Сообщение было отредактировано: 5 дек 19, 15:19
5 дек 19, 15:18    [22033264]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
hotcolt,

и что не получается?
простейший вариант использования оконной версии sum()
5 дек 19, 15:59    [22033314]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
hotcolt
Member

Откуда:
Сообщений: 5
WarAnt,
Можно пример написать. Мне предлагают циклом просто решать.
5 дек 19, 16:12    [22033330]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
hotcolt,

declare @t table (date date, value float)

insert @t
values 
('20191101', 444),
('20191102', 2),
('20191103', 2),
('20191104', 1),
('20191105', 1),
('20191106', 4),
('20191107', 8),
('20191201', 500),
('20191202', 3),
('20191203', 4),
('20191204', 5),
('20191205', 3),
('20191206', 5),
('20191207', 8)

SELECT *, sum(value) over (partition by year(date), month(date) ORDER by date) 
FROM @t


Сообщение было отредактировано: 5 дек 19, 17:17
5 дек 19, 17:17    [22033398]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
WarAnt, т.к. изменения могут быть не каждый день, нужно ещё таблицу-календарь присоединить.
5 дек 19, 17:18    [22033401]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Minamoto
WarAnt, т.к. изменения могут быть не каждый день, нужно ещё таблицу-календарь присоединить.


это вы ТСу советуйте мне и так понятно:)), я просто нарисовал пример использования оконной функции
5 дек 19, 18:01    [22033446]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
hotcolt
Member

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

SELECT 
CONVERT (datetime,convert(char(8),DATE_CALC_INT)) AS RealDate ,
MONTH(CONVERT (datetime,convert(char(8),DATE_CALC_INT))) AS RealMonth,
PHARMACY_ID,
PRODUCT_ID,
QUNTITY,
SUM(QUNTITY) OVER (PARTITION BY PHARMACY_ID, PRODUCT_ID, MONTH(CONVERT (datetime,convert(char(8),DATE_CALC_INT)))
ORDER BY CONVERT (datetime,convert(char(8),DATE_CALC_INT)) ,IS_RST DESC) AS OSTATKI,IS_RST
FROM [ANALYTICS_DEPARTMENT_DB].[FTT\k.chepurko].[Fact_Exc_StockMove]
ORDER BY CONVERT (datetime,convert(char(8),DATE_CALC_INT))  


Вот так вот ?

Сообщение было отредактировано: 6 дек 19, 13:49
6 дек 19, 11:09    [22033872]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
hotcolt
WarAnt,

SELECT
CONVERT (datetime,convert(char(8),DATE_CALC_INT)) AS RealDate ,
MONTH(CONVERT (datetime,convert(char(8),DATE_CALC_INT))) AS RealMonth,
PHARMACY_ID,
PRODUCT_ID,
QUNTITY,
SUM(QUNTITY) OVER (PARTITION BY PHARMACY_ID, PRODUCT_ID, MONTH(CONVERT (datetime,convert(char(8),DATE_CALC_INT)))
ORDER BY CONVERT (datetime,convert(char(8),DATE_CALC_INT)) ,IS_RST DESC) AS OSTATKI,IS_RST
FROM [ANALYTICS_DEPARTMENT_DB].[FTT\k.chepurko].[Fact_Exc_StockMove]
ORDER BY CONVERT (datetime,convert(char(8),DATE_CALC_INT))

Вот так вот ?


так или не так, вам должно быть виднее по результату работы запроса:)
6 дек 19, 11:54    [22033977]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
msLex
Member

Откуда:
Сообщений: 7729
WarAnt
hotcolt
WarAnt,

SELECT 
CONVERT (datetime,convert(char(8),DATE_CALC_INT)) AS RealDate ,
MONTH(CONVERT (datetime,convert(char(8),DATE_CALC_INT))) AS RealMonth,
PHARMACY_ID,
PRODUCT_ID,
QUNTITY,
SUM(QUNTITY) OVER (PARTITION BY PHARMACY_ID, PRODUCT_ID, MONTH(CONVERT (datetime,convert(char(8),DATE_CALC_INT)))
ORDER BY CONVERT (datetime,convert(char(8),DATE_CALC_INT)) ,IS_RST DESC) AS OSTATKI,IS_RST
FROM [ANALYTICS_DEPARTMENT_DB].[FTT\k.chepurko].[Fact_Exc_StockMove]
ORDER BY CONVERT (datetime,convert(char(8),DATE_CALC_INT))  


Вот так вот ?


так или не так, вам должно быть виднее по результату работы запроса:)
6 дек 19, 13:50    [22034175]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
hotcolt
Member

Откуда:
Сообщений: 5
Увы, нет, так считает только по датам когда было движение, и на первые числа строки задваиваются, потому что на первые числа так же есть движение
6 дек 19, 16:30    [22034425]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
hotcolt
Member

Откуда:
Сообщений: 5
Вообщем не получается оконной функцией , из за пробелов в датах , а присоединить таблицу со всеми датами периода * магазины* продукты , не хватило памяти.
Подскажите , как реализовать вариант с циклом, плиз
10 дек 19, 11:30    [22036665]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
Владислав Колосов
Member

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

куда же память делась? Годовой календарь содержит всего 365 строк.
10 дек 19, 13:23    [22036815]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
hotcolt
Увы, нет, так считает только по датам когда было движение, и на первые числа строки задваиваются, потому что на первые числа так же есть движение


Вы убрали год из partition, может это причина того что у вам там задваивается?
Вторая причина почему задваивается в том что вы неправильно указали формат хранения данных в первом сообщении.
Насчет цикла,я думаю сами разберетесь, я курсоры не использую, оконная функция сдесь в любом случае решает задачу.
10 дек 19, 13:54    [22036881]     Ответить | Цитировать Сообщить модератору
 Re: Остатки по дням  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Владислав Колосов
hotcolt,

куда же память делась? Годовой календарь содержит всего 365 строк.

Почти уверен, что ТС на полном серьезе попытался соорудить декартово произведение "со всеми датами периода * магазины* продукты"
10 дек 19, 13:55    [22036882]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить