sql 分组 求累计值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 分组 求累计值相关的知识,希望对你有一定的参考价值。

按照日期分组,求到分组的日期为止的合计值
如下
日期 数量 目前为止合计
2008-01-01 2 2
2008-01-02 3 5
2008-01-09 4 9
'目前为止合计'='目前为止合计'+'数量'
就是如何得到"目前为止合计"字段的值啊
不知道用sql语言如何实现啊(注:不用其他程序辅助,要纯sql语句)
是按照日期分组显示的报表,要求得当前的合计加上上一分组中的合计值,不是一个简单的sum能解决的,sum只能求得当前分组中的合计,我要的是当前分组中的合计加上上一分组中的合计,也就是如何取得上一分组中的合计值,最好不要向数据库中写入数据

UPDATE table1
SET 目前为止合计 = (SELECT SUM(数量) FROM Table1
WHERE(日期 <= table1.日期))

sql2005下
运行前数据
日期 数量 目前为止合计
2008-01-01 2
2008-01-02 3
2008-01-09 4

运行后数据
日期 数量 目前为止合计
2008-01-01 2 2
2008-01-02 3 5
2008-01-09 4 9

-----------------------------------------------------------------------------------
查询:
SELECT Table1.日期, Table1.数量, temp.目前为止合计
FROM Table1 INNER JOIN (SELECT t2.日期, SUM(t1.数量) AS 目前为止合计 FROM Table1 AS t1 INNER JOIN Table1 AS t2 ON t1.日期 <= t2.日期 GROUP BY t2.日期) AS temp ON Table1.日期 = temp.日期
参考技术A UPDATE
table1
SET
目前为止合计
=
(SELECT
SUM(数量)
FROM
Table1
WHERE(日期
<=
table1.日期))
sql2005下
运行前数据
日期
数量
目前为止合计
2008-01-01
2
2008-01-02
3
2008-01-09
4
运行后数据
日期
数量
目前为止合计
2008-01-01
2
2
2008-01-02
3
5
2008-01-09
4
9
-----------------------------------------------------------------------------------
查询:
SELECT
Table1.日期,
Table1.数量,
temp.目前为止合计
FROM
Table1
INNER
JOIN
(SELECT
t2.日期,
SUM(t1.数量)
AS
目前为止合计
FROM
Table1
AS
t1
INNER
JOIN
Table1
AS
t2
ON
t1.日期
<=
t2.日期
GROUP
BY
t2.日期)
AS
temp
ON
Table1.日期
=
temp.日期
参考技术B select 日期,数量,
(select sum(数量) from table1 where 日期<=A.日期) as 目前为止合计
from table1 A
参考技术C create trigger t1 on zhidao3 for update as
begin
update zhidao3 set heji=(select shuliang from zhidao3
where datepart(dy,shijian)=datepart(dy,getdate()))+(select heji from zhidao3
where datepart(dy,shijian)=datepart(dy,getdate()-1))
where datepart(dy,shijian)=datepart(dy,getdate())
end
我写了一个,你试试
参考技术D 合计某个字段可以用sum(字段)来取,就是不知道日期合计会有什么结果。

sql server求分组最大值,最小值,最大值对应时间,和最小值对应时间

先创建数据库

CREATE TABLE [dbo].[Students](
[Id] [int] IDENTITY(1,1) NOT NULL,
[age] [int] NULL,
[name] [nvarchar](50) NULL,
[addTime] [datetime]  NULL
) ON [PRIMARY]

 

插入几条测试数据

INSERT [dbo].[Students] ([age], [name], [addTime]) VALUES (22, N‘李四‘, ‘2015-04-08 01:00:00.000‘)
INSERT [dbo].[Students] ([age], [name], [addTime]) VALUES (8, N‘李四‘, ‘2017-05-03 00:00:00.000‘)
INSERT [dbo].[Students] ([age], [name], [addTime]) VALUES (98, N‘李四‘, ‘2017-10-03 00:00:00.000‘)
INSERT [dbo].[Students] ([age], [name], [addTime]) VALUES (34, N‘张三‘, ‘2016-09-08 00:00:00.000‘)
INSERT [dbo].[Students] ([age], [name], [addTime]) VALUES (45, N‘张三‘,‘2011-05-08 00:00:00.000‘)
INSERT [dbo].[Students] ( [age], [name], [addTime]) VALUES (5, N‘张三‘, ‘2014-04-01 00:00:00.000‘)

第一种写法:

  这种写法用到了窗口函数,窗口函数的行为描述出现在函数的OVER子句中,并涉及多个元素,3个核心元素分别是:分区,排序和框架

select distinct name,
maxAge, max(case maxAgenum when 1 then addtime else ‘‘ end) over(partition by name) maxAddTime ,
minage,max(case minAgenum when 1 then addtime else ‘‘ end) over(partition by name) minAddTime
from (
select name,addtime,
max(age) over(partition by name) maxAge,
min(age) over(partition by name) minAge,
RANK() over(partition by name order by age desc) maxAgeNum ,
RANK() over(partition by name order by age ) minAgeNum from students
) s

第二种写法:

with s as
(
select name,max(age) maxAge,min(age) minAge from students
group by name
)
select name,max(maxAge) maxAge,max(maxAgeTime) maxAgeTime,max(minAge) minAge,max(minAgeTime) minAgeTime from (
select ss.name,s.maxAge,ss.addTime maxAgeTime,0 minAge, ‘‘ minAgeTime from students ss inner join s on ss.name=s.name and ss.age=s.maxAge
union all
select ss.name,0 maxAge , ‘‘ maxAgeTime,s.minAge minAge,ss.addTime minAgeTime from students ss inner join s on ss.name=s.name and ss.age=s.minAge
) a group by name

 

结果如下图:

 技术分享图片

 

技术分享图片





























以上是关于sql 分组 求累计值的主要内容,如果未能解决你的问题,请参考以下文章

【SQL】根据一个字段分组求另一个字段的最大值,并带出其他字段

08章 分组查询子查询原生SQL

sql server求分组最大值,最小值,最大值对应时间,和最小值对应时间

数据库SQL的分组函数

SQL分组查询最大值最小值

HiveQL实现累积求和