powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Остатки на каждый день
11 сообщений из 11, страница 1 из 1
Остатки на каждый день
    #39982188
newoneman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

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

Есть таблица Итогов - накопительный итог на каждый первый день месяца.
Есть таблица Движений - движения в разные дни.
Таблица Календарь - созданая мной таблица на каждую дату которой нужно опредлелить остаток.

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

Я понимаю что нужно как то использовать в запросе таблицу Итогов (для того чтоб не считать все из таблицы Движений, что более ресурсоемко) но как это сделать не знаю.

Прошу помощи, уверен с этим люди сталкивались в работе.

Для удобства, сделал скрипт по созданию таблиц с тестовыми данными.


--Создание табл Календарь
declare @Calendar table ([CalendarDate] datetime)--,[DayTypeID] int,[Hours] money)

declare @i datetime
set @i='20200101'
while @i<='20200301'
begin
INSERT INTO @Calendar([CalendarDate])--,[DayTypeID],[Hours])
select @i--,20,8.000
set @i=@i+1
end

select *
from @Calendar


-- Создание табл Остатков
create table #Remains (

[Дата] datetime,
[Вид] nvarchar(20),
[Тип] nvarchar(20),
[Название] nvarchar(20),
[Сумма] int
)

-- inserting test data into Remains
insert #Remains values('2020-01-01', 'Вид-1', 'Тип-1', 'Назв-1', 10)
insert #Remains values('2020-01-01', 'Вид-1', 'Тип-1', 'Назв-2', 5)
insert #Remains values('2020-02-01', 'Вид-1', 'Тип-1', 'Назв-1', 9)
insert #Remains values('2020-02-01', 'Вид-1', 'Тип-1', 'Назв-2', 5)
insert #Remains values('2020-02-01', 'Вид-2', 'Тип-1', 'Назв-2', 7)
insert #Remains values('2020-03-01', 'Вид-1', 'Тип-1', 'Назв-1', 6)

select * from #Remains


-- Создание табл Движений
create table #Moves (

[Дата] datetime,
[Вид] nvarchar(20),
[Тип] nvarchar(20),
[Название] nvarchar(20),
[Сумма] int
)

-- inserting test data into Remains
insert #Moves values('2020-01-01', 'Вид-1', 'Тип-1', 'Назв-1', 10)
insert #Moves values('2020-01-02', 'Вид-1', 'Тип-1', 'Назв-2', 5)
insert #Moves values('2020-02-01', 'Вид-2', 'Тип-1', 'Назв-1', 7)
insert #Moves values('2020-02-12', 'Вид-3', 'Тип-2', 'Назв-1', 3)

select * from #Moves

Версия SQL Server :
Microsoft SQL Server 2019 (RC1) - 15.0.1900.25 (X64)

Спасибо!
...
Рейтинг: 0 / 0
Остатки на каждый день
    #39982249
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newoneman,

Итоги не нужны, надо рассчитать накопительный итог по Движению.
...
Рейтинг: 0 / 0
Остатки на каждый день
    #39982251
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Итоги не нужны


Буратино дали два яблока, а потом три забрали. Сколько яблок осталось у Буратино?
...
Рейтинг: 0 / 0
Остатки на каждый день
    #39982268
newoneman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
newoneman,

Итоги не нужны, надо рассчитать накопительный итог по Движению.



Разве не использовать таблицу Итогов это верное решение с точки зрения оптимального решения?
Я думал, что таблицу Итоги можно использовать как вспомогательную, что бы не считать накоп.итог каждый раз с самого первого дня.
...
Рейтинг: 0 / 0
Остатки на каждый день
    #39982278
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newoneman,

эта таблица никак не поможет, т.к. в ней хранятся срезы накопительного итога таблицы движений, контрольные точки. Сомневаюсь, что движения хранятся относительно последнего среза. Таблица итогов уже будет находится в данных при расчете нарастающего итога по таблице движений.
...
Рейтинг: 0 / 0
Остатки на каждый день
    #39982282
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не пойму, в движении только расход хранится? А приход где?
...
Рейтинг: 0 / 0
Остатки на каждый день
    #39982291
newoneman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
не пойму, в движении только расход хранится? А приход где?


Там и приход и расход.
Да, немного не верный пример сделал.
Суммы с плюсом или с минусом в таблице Движений.
...
Рейтинг: 0 / 0
Остатки на каждый день
    #39982317
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newoneman,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
--Создание табл Календарь
declare @Calendar table ([CalendarDate] datetime)--,[DayTypeID] int,[Hours] money)

declare @i datetime, @datestart datetime = '20200101', @dateend datetime = '20200301';
set @i= @datestart
while @i<=@dateend
begin
INSERT INTO @Calendar([CalendarDate])--,[DayTypeID],[Hours])
select @i--,20,8.000
set @i=@i+1
end

select *
from @Calendar


-- Создание табл Остатков
declare @Remains table (

[Дата] datetime,
[Вид] nvarchar(20),
[Тип] nvarchar(20),
[Название] nvarchar(20),
[Сумма] int
)

-- inserting test data into Remains
insert @Remains values('2020-01-01', 'Вид-1', 'Тип-1', 'Назв-1', 10)
insert @Remains values('2020-01-01', 'Вид-1', 'Тип-1', 'Назв-2', 5)
insert @Remains values('2020-02-01', 'Вид-1', 'Тип-1', 'Назв-1', 9)
insert @Remains values('2020-02-01', 'Вид-1', 'Тип-1', 'Назв-2', 5)
insert @Remains values('2020-02-01', 'Вид-2', 'Тип-1', 'Назв-2', 7)
insert @Remains values('2020-03-01', 'Вид-1', 'Тип-1', 'Назв-1', 6)

select * from @Remains


-- Создание табл Движений
declare @Moves table (

[Дата] datetime,
[Вид] nvarchar(20),
[Тип] nvarchar(20),
[Название] nvarchar(20),
[Сумма] int
)

-- inserting test data into Remains
insert @Moves values('2020-01-01', 'Вид-1', 'Тип-1', 'Назв-1', 10)
insert @Moves values('2020-01-02', 'Вид-1', 'Тип-1', 'Назв-2', 5)
insert @Moves values('2020-02-01', 'Вид-2', 'Тип-1', 'Назв-1', 7)
insert @Moves values('2020-02-12', 'Вид-3', 'Тип-2', 'Назв-1', 3)

select * from @Moves;

select
 c.CalendarDate, a.Вид, a.Тип, a.Название,
 sum(isnull(m.Сумма, 0) + isnull(r.Сумма, 0)) over (partition by a.Вид, a.Тип, a.Название order by c.CalendarDate) as rt
from
 @Calendar c cross join
 (
  select Вид, Тип, Название from @Moves where Дата between @datestart and @dateend
  union
  select Вид, Тип, Название from @Remains where Дата between @datestart and @dateend
 ) a left join
 @Moves m on m.Дата = c.CalendarDate and m.Вид = a.Вид and m.Тип = a.Тип and m.Название = a.Название left join
 @Remains r on  r.Дата = c.CalendarDate and r.Вид = a.Вид and r.Тип = a.Тип and r.Название = a.Название
order by
 a.Вид, a.Тип, a.Название, c.CalendarDate;


...
Рейтинг: 0 / 0
Остатки на каждый день
    #39982324
newoneman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

Спасибо тебе добрый человек.

Буду разбираться и использовать.

Еще раз спасибо!
...
Рейтинг: 0 / 0
Остатки на каждый день
    #39982438
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newoneman,

откуда возникли такие остатки на 1 февраля? Данные нерепрезентативны.
На 1 января Назв-1 остаток 10, движение - приход 10, а на 1 февраля Вы пишете остаток 9. Куда делись 11 единиц?
...
Рейтинг: 0 / 0
Остатки на каждый день
    #39982440
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newoneman,

авторИтоги можно использовать как вспомогательную, что бы не считать накоп.итог каждый раз с самого первого дня.
Не так, накопительный итог рассчитывается одним запросом, а не за каждый день отдельно.
sum([сумма]) over(order by дата)

В результат попадут и "срезы" итогов. Если в какой-то день по календарю не было движения, то используем фиктивное движение 0 рублей за этот день.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Остатки на каждый день
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]