SQL分组汇总问题

newqq 2017-10-07 12:43:39
CREATE TABLE #test(A VARCHAR(100),b FLOAT,c DATE)

INSERT INTO #test ( A, B ,c)
SELECT 'A01',10,'2017-10-06' UNION ALL
SELECT 'A01',50,'2017-10-07' UNION ALL
SELECT 'A01',30,'2017-10-16' UNION ALL
SELECT 'B01',10,'2017-10-06'
SELECT * FROM #test

想要的结果:
A01 60 2017-10-06
A01 30 2017-10-16
B01 10 2017-10-06

说明:按照A分组,取C的最小日期+3天,也就是2017-10-06至10月2017-10-09之内的记录汇总
...全文
259 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
nettman 2017-10-08
  • 打赏
  • 举报
回复
感谢楼主分享
  • 打赏
  • 举报
回复
说错 应该比游标快一点
  • 打赏
  • 举报
回复
按A 和C字段 分组分段递归效率比递归应该高一点,为了验证密集日期分段准确性 我增加几行数据做测试
if object_id('tempdb.dbo.#test') is not null drop table #test
CREATE TABLE #test(A VARCHAR(100),b FLOAT,c DATE) 

INSERT INTO #test ( A, B ,c) 

SELECT 'A01',10,'2017-10-06' UNION ALL 
SELECT 'A01',50,'2017-10-07' UNION ALL 
SELECT 'A01',30,'2017-10-16' UNION ALL 
SELECT 'A01',5,'2017-10-17' UNION ALL 
SELECT 'A01',30,'2017-10-18' UNION ALL 
SELECT 'A01',5,'2017-10-20' UNION ALL 
SELECT 'A01',5,'2017-10-21' UNION ALL
SELECT 'A01',5,'2017-10-22' UNION ALL
SELECT 'B01',10,'2017-10-06' UNION ALL   
SELECT 'B01',10,'2017-10-07' UNION ALL  
SELECT 'B01',10,'2017-10-20'  
select * from #test
;with t as
	(
	select a,b,c from #test a where not exists(select 1 from #test b where a.a=b.a and (a.c > b.c and a.c<=dateadd(d,3,b.c)) )
	union all 
	select a.a,a.b,min(a.c)over(partition by t.a,t.c) from #test a,t where a.A =t.a and a.c > dateadd(d,3,t.c) and a.c <=dateadd(d,6,t.c)
	)
,t1 as(select distinct a,b,c from t)
select a,b=(select sum(b.b) from #test b where b.A =a.A and b.c between a.c and dateadd(d,3,a.c)),c from t1 a order by a,c
A	b	c
A01	10	2017-10-06
A01	50	2017-10-07
A01	30	2017-10-16
A01	5	2017-10-17
A01	30	2017-10-18
A01	5	2017-10-20
A01	5	2017-10-21
A01	5	2017-10-22
B01	10	2017-10-06
B01	10	2017-10-07
B01	10	2017-10-20
a	b	c
A01	60	2017-10-06
A01	65	2017-10-16
A01	15	2017-10-20
B01	20	2017-10-06
B01	10	2017-10-20
二月十六 2017-10-07
  • 打赏
  • 举报
回复
if not object_id(N'Tempdb..#test') is null
drop table #test
GO
CREATE TABLE #test(A VARCHAR(100),b FLOAT,c DATE)
INSERT INTO #test ( A, B ,c)
SELECT 'A01',10,'2017-10-06' UNION ALL
SELECT 'A01',50,'2017-10-07' UNION ALL
SELECT 'A01',30,'2017-10-16' UNION ALL
SELECT 'A01',5,'2017-10-17' UNION ALL
SELECT 'A01',5,'2017-10-20' UNION ALL
SELECT 'B01',10,'2017-10-06' UNION ALL
SELECT 'B01',10,'2017-10-07' UNION ALL
SELECT 'B01',10,'2017-10-20'
if not object_id(N'Tempdb..#temptest') is null
drop table #temptest
GO
CREATE TABLE #temptest(A VARCHAR(100),B FLOAT,C DATE)
declare @A VARCHAR(100),@b FLOAT,@c DATE,@tb FLOAT
SET @tb=0
declare auth_cur cursor for
select A,B, C
from #test ORDER BY c
open auth_cur
fetch next from auth_cur into @A,@b,@c
while (@@fetch_status=0)
begin
IF(NOT EXISTS(SELECT * FROM #temptest WHERE A=@A AND DATEDIFF(DAY,c,@c)<=3 ))
BEGIN
INSERT INTO #temptest VALUES(@A,@b,@c)
END
ELSE
BEGIN
UPDATE #temptest SET b=b+@b WHERE A=@A AND DATEDIFF(DAY,c,@c)<=3
END
fetch next from auth_cur into @A,@b,@c
end
close auth_cur
deallocate auth_cur
SELECT * FROM #temptest ORDER BY A,c


卖水果的net 2017-10-07
  • 打赏
  • 举报
回复
三天的数据汇总到一行? 建议楼主多给出一些测试数据,和预期结果。
  • 打赏
  • 举报
回复
2017-10-6 2017-10-8 2017-10-9 2017-10-10 2017-10-11 合并结果是不是 2017-10-6 2017-10-10
newqq 2017-10-07
  • 打赏
  • 举报
回复
引用 3 楼 qq_37170555 的回复:
引用 2楼我是你的主体 的回复:
最小日期加3天
如果还有一条A01的10-17的记录,是不是汇总后A01就有三条记录了
和10-16的汇总
newqq 2017-10-07
  • 打赏
  • 举报
回复
修正: CREATE TABLE #test(A VARCHAR(100),b FLOAT,c DATE) INSERT INTO #test ( A, B ,c) SELECT 'A01',10,'2017-10-06' UNION ALL SELECT 'A01',50,'2017-10-07' UNION ALL SELECT 'A01',30,'2017-10-16' UNION ALL SELECT 'A01',5,'2017-10-17' UNION ALL SELECT 'A01',5,'2017-10-20' UNION ALL SELECT 'B01',10,'2017-10-06' UNION ALL SELECT 'B01',10,'2017-10-07' UNION ALL SELECT 'B01',10,'2017-10-20' --结果: A01 60 2017-10-06 A01 35 2017-10-16 A01 5 2017-10-20 B01 20 2017-10-06 B01 10 2017-10-20
newqq 2017-10-07
  • 打赏
  • 举报
回复
CREATE TABLE #test(A VARCHAR(100),b FLOAT,c DATE) INSERT INTO #test ( A, B ,c) SELECT 'A01',10,'2017-10-06' UNION ALL SELECT 'A01',50,'2017-10-07' UNION ALL SELECT 'A01',30,'2017-10-16' UNION ALL SELECT 'A01',5,'2017-10-17' UNION ALL SELECT 'A01',5,'2017-10-20' UNION ALL SELECT 'B01',10,'2017-10-06' UNION ALL SELECT 'B01',10,'2017-10-07' UNION ALL SELECT 'B01',10,'2017-10-20' --想要的结果: A01 60 2017-10-06 A01 35 2017-10-16 A01 5 2017-10-20 B01 10 2017-10-06 B01 10 2017-10-07 B01 20 2017-10-06 B01 10 2017-10-20
听雨停了 2017-10-07
  • 打赏
  • 举报
回复
引用 2楼我是你的主体 的回复:
最小日期加3天
如果还有一条A01的10-17的记录,是不是汇总后A01就有三条记录了
newqq 2017-10-07
  • 打赏
  • 举报
回复
最小日期加3天
通过慢sql分析的学习,了解什么是慢sql,以及慢SQL会引起那些性能问题。清楚慢sql日志的设置,然后再通过慢sql分析工具的学习,清楚慢sql分析的步骤和流程。慢sql分析工具:mysqldumpslow工具、explain工具、profile工具、Optimizer Trace工具。 提供课程中所使用的sql语句。 课程内容:第一章:课程简介1、课程介绍2、课程大纲 第二章:慢sql简介1、慢sql简介2、慢sql会引起的问题 第三章:慢日志的设置1、慢sql的分析流程2、慢日志参数理解3、慢日志参数设置:第1种方式:my.ini文件设置4、慢日志参数设置:第2种方式:sql脚本设置5、慢日志参数设置-效果验证 第四章:如何发现慢sql1、如何发现慢sql:第1种方式:慢日志文件2、如何发现慢sql:第2种方式:mysql库的slow_log表 第五章:慢sql分析工具1、慢sql提取-mysqldumpslow工具-使用方法2、慢sql提取-mysqldumpslow工具-操作实战3、慢sql的执行计划分析-explain分析-执行计划结果说明4、慢sql的执行计划分析-explain分析-索引介绍+type类型举例5、慢sql的资源开销分析-profile分析-分析步骤6、慢sql的资源开销分析-profile分析-show profile执行阶段说明7、慢sql的资源开销分析-profile分析-完整列表说明+操作实战8、慢sql的跟踪分析-Optimizer Trace分析-分析步骤9、慢sql的跟踪分析-Optimizer Trace表的介绍10、索引失效场景举例 第六章:慢日志清理1、慢日志清理

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧