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

Откуда:
Сообщений: 79
Коллеги, сильно туплю.
Необходимо посчитать нарастающий итог по каждому продукту.
Исходная таблица, извините за форматирование:
Date - дата
Product - продукт
Pack - количество

Date Product Pack
2018-01-01 00:00:00.000 Принтер 1
2018-01-02 00:00:00.000 Компьютер 2
2018-01-03 00:00:00.000 Принтер 3
2018-01-04 00:00:00.000 Принтер 4
2018-01-05 00:00:00.000 Принтер 5

Написал:
SELECT L.[Date],L.[Product],L.Pack,SUM (R.[Pack]) as RunningTotal
FROM tbl as L left outer join tbl as R
on L.date>=R.date and L.Product=R.Product
group by L.[Date] ,L.[Product],L.Pack
order by L.Date

Получилось:

Date Product Pack RunningTotal
2018-01-01 00:00:00.000 Принтер 1 1
2018-01-02 00:00:00.000 Компьютер 2 2
2018-01-03 00:00:00.000 Принтер 3 4
2018-01-04 00:00:00.000 Принтер 4 8
2018-01-05 00:00:00.000 Принтер 5 13

Нужно так, добавить на каждую дату сумму итогов по каждому продукту:

Date Product Pack RunningTotal
2018-01-01 00:00:00.000 Принтер 1 1
2018-01-02 00:00:00.000 Принтер 0 1
2018-01-02 00:00:00.000 Компьютер 2 2
2018-01-03 00:00:00.000 Принтер 3 4
2018-01-03 00:00:00.000 Компьютер 0 2
2018-01-04 00:00:00.000 Компьютер 0 2
2018-01-04 00:00:00.000 Принтер 4 8
2018-01-05 00:00:00.000 Компьютер 0 2
2018-01-05 00:00:00.000 Принтер 5 13

Как это сделать?

Спасибо.
10 окт 18, 11:37    [21700235]     Ответить | Цитировать Сообщить модератору
 Re: Накопительный итог  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
ondorsal,

в гугл или форум вставить "накопительный итог" не получилось?
10 окт 18, 11:38    [21700238]     Ответить | Цитировать Сообщить модератору
 Re: Накопительный итог  [new]
ondorsal
Member

Откуда:
Сообщений: 79
TaPaK,
Гугл у меня заблокирован, работает только sql.ru

Разобрался с форматированием таблиц.
Исходная таблица:
Date Product Pack
2018-01-01 00:00:00.000 Принтер 1
2018-01-02 00:00:00.000 Компьютер 2
2018-01-03 00:00:00.000 Принтер 3
2018-01-04 00:00:00.000 Принтер 4
2018-01-05 00:00:00.000 Принтер 5



Получилось:
Date Product Pack RunningTotal
2018-01-01 00:00:00.000 Принтер 1 1
2018-01-02 00:00:00.000 Компьютер 2 2
2018-01-03 00:00:00.000 Принтер 3 4
2018-01-04 00:00:00.000 Принтер 4 8
2018-01-05 00:00:00.000 Принтер 5 13

Нужно так, добавить на каждую дату сумму итогов по каждому продукту:

Date Product Pack RunningTotal
2018-01-01 00:00:00.000 Принтер 1 1
2018-01-02 00:00:00.000 Принтер 0 1
2018-01-02 00:00:00.000 Компьютер 2 2
2018-01-03 00:00:00.000 Принтер 3 4
2018-01-03 00:00:00.000 Компьютер 0 2
2018-01-04 00:00:00.000 Компьютер 0 2
2018-01-04 00:00:00.000 Принтер 4 8
2018-01-05 00:00:00.000 Компьютер 0 2
2018-01-05 00:00:00.000 Принтер 5 13
10 окт 18, 11:49    [21700255]     Ответить | Цитировать Сообщить модератору
 Re: Накопительный итог  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
ondorsal,

https://www.sql.ru/forum/afsearch.aspx?s= ????????????? ????&submit=?????&bid=1
10 окт 18, 12:01    [21700272]     Ответить | Цитировать Сообщить модератору
 Re: Накопительный итог  [new]
iiyama
Member

Откуда:
Сообщений: 642
Да не, он нарастающий итог итак считает
ему надо на каждый день считать, т.е добавить таблицу календарь
типа ..
declare @Calendar table ([Date] date)
insert @Calendar values('20180101'),('20180102'),('20180103'),('20180104'),('20180105'),('20180106')
------------
declare @tbl table([Date] date, Product nvarchar(20), Pack int)
insert into @tbl values('20180101','Printer',1),
				('20180102','Computer',2),
				('20180103','Printer',3),
				('20180104','Printer',4),
				('20180105','Printer',5)

;with Products AS
(
 select Product from @tbl group by Product

)

select T0.Date, T0.Product, ISNULL(T1.Pack,0) AS  Pack, SUM(ISNULL(T1.Pack,0)) OVER(PARTITION BY T0.Product ORDER BY T0.date  rows between unbounded preceding and current row) AS [RunningTotal]
from 
(
select C.Date, P.Product 
from Products P cross join @Calendar C
)T0
	LEFT JOIN @tbl T1 ON T0.Date=T1.Date AND T0.Product=T1.Product
order by 1,2
10 окт 18, 13:36    [21700441]     Ответить | Цитировать Сообщить модератору
 Re: Накопительный итог  [new]
ondorsal
Member

Откуда:
Сообщений: 79
iiyama,
Спасибо! Нужно было именно это.
10 окт 18, 14:04    [21700490]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить