Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Остатки на каждый день / 11 сообщений из 11, страница 1 из 1
21.07.2020, 13:02
    #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
21.07.2020, 14:24
    #39982249
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Остатки на каждый день
newoneman,

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


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

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



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

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


Там и приход и расход.
Да, немного не верный пример сделал.
Суммы с плюсом или с минусом в таблице Движений.
...
Рейтинг: 0 / 0
21.07.2020, 16:51
    #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
21.07.2020, 17:02
    #39982324
newoneman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Остатки на каждый день
invm,

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

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

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

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

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

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


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