#sql #sql-server
#sql #sql-сервер
Вопрос:
Это моя таблица в SQL Server :
Date Number weight
----------------------------------
2020-06-21 20 185
2020-06-21 10 90
2020-06-22 50 289
2020-06-22 20 175
2020-06-23 30 201
2020-06-24 10 95
2020-06-25 20 190
и я хочу, чтобы этот вывод был на SQL Server
Date Number Sum(Number) weight Sum(weight)
--------------------------------------------------------
2020-06-21 30 30 275 275
2020-06-22 70 100 464 739
2020-06-23 30 130 201 940
2020-06-24 10 140 95 1035
2020-06-25 20 160 190 1225
Кто-нибудь знает, как я могу это сделать?
Комментарии:
1. Вы вообще что-нибудь пробовали???
Ответ №1:
Вам нужна совокупная сумма. Который использует оконные функции:
select date, number, sum(number) over (order by date) as running_sum_number,
weight, sum(weight) over (order by date) as running_sum_weight
from t
order by date;
Ответ №2:
Вы можете использовать любое решение, приведенное ниже, тремя различными способами:
create table TblData ([Date] date, [Number] int, [weight] int)
insert into TblData values
('2020-06-21',20,185),
('2020-06-21',10,90 ),
('2020-06-22',50,289),
('2020-06-22',20,175) ,
('2020-06-23',30,201),
('2020-06-24',10,95 ),
('2020-06-25',20,190)
Способ 1:
select [Date]
, number
, SUM(number) OVER(ORDER BY [Date]
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS SumNumber
, weight
, SUM(weight) OVER(ORDER BY [Date]
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS SumWeight
from (
Select date
, sum(number) as [Number]
, sum(weight) as [Weight]
from TblData
group by date
)TblData
Способ 2:
select [Date]
, number
, (SELECT SUM(number) FROM TblData t2 WHERE t2.[Date] <= TblData.[Date]) AS SumNumber
, weight
, (SELECT SUM(weight) FROM TblData t2 WHERE t2.[Date] <= TblData.[Date]) AS SumWeight
from
(
Select date
, sum(number) as [Number]
, sum(weight) as [Weight]
from TblData
group by date
)
TblData
Способ 3:
;with cte as(
Select *
, ROW_NUMBER() OVER (ORDER BY [Date]) AS RN
from
(
Select date
, sum(number) as [Number]
, sum(weight) as [Weight]
from TblData
group by date
)tbl
)select [Date]
, [Number]
, (SELECT SUM([Number]) FROM cte t2 WHERE t2.RN <= cte.RN) AS SumNumber
, [Weight]
, (SELECT SUM([Weight]) FROM cte t2 WHERE t2.RN <= cte.RN) AS SumWeight
from cte
Вот живая демонстрация db<>fiddle.
Ответ №3:
Попробуйте приведенный ниже код для получения желаемого результата,
declare @tbl as table([Date] date,Number int, [weight] int)
----------------------------------
insert into @tbl values
('2020-06-21',20,185),
('2020-06-21',10,90 ),
('2020-06-22',50,289),
('2020-06-22',20,175) ,
('2020-06-23',30,201),
('2020-06-24',10,95 ),
('2020-06-25',20,190)
;with tblCTE
as
(
select date, sum(number) as number,sum(weight) as weight from @tbl group by date
)
select Date, Number, sum(number) over (order by date) as [Sum(Number)],
weight, sum(weight) over (order by date) as [Sum(weight)]
from tblCTE
order by date;