假设有如下两张表:
表A:
id    type    begin_date   end_date  count
---------------------------------------------
1     A      2007-5-12     2007-5-14   30
2     A      2007-5-11     2007-5-13   20
3     B      2007-5-12     2007-5-15   50
4     B      2007-5-13     2007-5-14   30

表示 从begin_date到end_date的时间段内,每天都会有30数量的A,其它行都是相同的意思

表B:(消耗表)
id   type   use_date  count
------------------------------
1    A      2007-5-11  15
2    A      2007-5-12  15
3    B      2007-5-12  20
4    B      2007-5-13  30

表A和表B的id没有关系,现在要根据某一时间段,查询剩余数,比如:2007-5-11到2007-5-14的结余数量:

得到余下结果:
id type 2007-5-11  2007-5-12  2007-5-13 2007-5-14
1  A      5          35         50         30
2  B      0          30         50         80

其中2007-5-12,5-13,5-14是根据条件动态生成。。。。

怎么比较高效的实现上述功能。。。我想到的需要循环好几次,实在是够理想,请朋友们一起想想,或者,通过修改表结构,达到相同的目的

解决方法:

create table TableA(id int, type char(1), begin_date smalldatetime, end_date smalldatetime, [count] int)
insert TableA select 1 ,'A', '2007-5-12', '2007-5-14', 30
union all select 2 ,'A', '2007-5-11', '2007-5-13', 20
union all select 3 ,'B', '2007-5-12', '2007-5-15', 50
union all select 4 ,'B', '2007-5-13', '2007-5-14', 30
go
create table TableB(id int, type char(1), use_date smalldatetime, [count] int)
insert TableB select 1 ,'A', '2007-5-11', 15
union all select 2 ,'A', '2007-5-12', 15
union all select 3 ,'B', '2007-5-12', 20
union all select 4 ,'B', '2007-5-13', 30
go

DECLARE @BeginDate smalldatetime     --开始日期
DECLARE @EndDate smalldatetime      --结束日期
DECLARE @TmpDate smalldatetime
DECLARE @EXECUTE_SQL nvarchar(4000)        --
SELECT @BeginDate='2007-5-11'
    ,@EndDate='2007-5-14'
    ,@TmpDate=@BeginDate
    ,@EXECUTE_SQL='SELECT type'

CREATE TABLE #T(TDate smalldatetime) --构造临时表,用于分类统计,和构造行列转换语句
WHILE @TmpDate<=@EndDate
    BEGIN
        INSERT INTO #T SELECT @TmpDate
        SELECT @EXECUTE_SQL=@EXECUTE_SQL+',SUM(CASE TDATE WHEN '''+CONVERT(nchar(10),@TmpDate,120)+''' THEN [count] ELSE 0 END) AS ['+CONVERT(nchar(10),@TmpDate,120)+']'
            ,@TmpDate=DATEADD(day,1,@TmpDate)
        
    END
SET @EXECUTE_SQL=@EXECUTE_SQL+CHAR(10)+'FROM #T1 GROUP BY type'

--没有行列转换前统计,插入表#T1
SELECT type,TDate,SUM([count]) AS [count] INTO #T1
    FROM (
        SELECT type,TDate,[count] FROM TableA CROSS JOIN #T WHERE (begin_date BETWEEN  @BeginDate AND @EndDate
            OR  end_date BETWEEN  @BeginDate AND @EndDate)
            AND TDate BETWEEN begin_date AND end_date
        UNION ALL SELECT type,use_date,-[count] FROM TableB WHERE use_date BETWEEN  @BeginDate AND @EndDate
        ) AS A
    GROUP BY type,TDate
    ORDER BY type,TDate
EXECUTE( @EXECUTE_SQL)        
DROP TABLE TableA,TableB,#T,#T1
go

/**//*
type    2007-05-11    2007-05-12    2007-05-13    2007-05-14
---------------------------------------------------------------------------
A        5    35        50        30
B        0    30        50        80
*/

以上方法没有使用到游标,只是使用到2张临时表就可以拷定,其实也可以使用1个临时表就可以,只不过为了方便更好的了解计算方法,把分类统计过程独立出来。
这方法虽然语句有点长吧,但我相信比使用游标更快。

问题来源:http://community.csdn.net/Expert/topic/5532/5532084.xml?temp=.7621729

解决一条高难度的,关于时间段 数据汇总问题相关推荐

  1. 高难度的c语言程序例子,高难度脑筋急转弯分享

    脑筋急转弯是近年来兴起的一种十分受欢迎的智力与思维灵敏度的言语形式.下面学习啦小编为大家整理了高难度脑筋急转弯,希望对大家有帮助. 高难度脑筋急转弯[一] 1. 给一个瞎子52张扑克牌,并告诉他里面恰 ...

  2. 高难度c语言编程题,高难度脑筋急转弯题目合集带答案

    脑筋急转弯,是指一些不能用惯性思维来回答的问题.经常玩这类游戏,可以锻炼人的发散思维以及应变能力,提高反应速度.今天给大家带来一些脑筋急转弯干货,希望可以帮助到有需要的同学! 高难度脑筋急转弯题目合集 ...

  3. 海天蚝油《挑战不可能》清华博士远程驾驶无人车迎战高难度车道

    海天蚝油<挑战不可能>迈进5G时代,清华博士远程驾驶无人车迎战高难度车道.由加一点就好鲜好鲜的海天蚝油独家冠名播出<挑战不可能之加油中国>本周日晚八点央视一套震撼继续!少年中国 ...

  4. [管理学习]《高难度谈话》第一章 挑选出三种谈话 记录

    高难度谈话 每段高难度谈话都有三层对话结构:1."发生了什么"对话:2.情绪对话:3.自我认知对话 人们的话语之中其实包含了一种潜在的对话结构,而理解这一结构是我们了解谈话的第一步 ...

  5. 解决linux 升级高版本python3.7后yum不能使用的问题

    解决linux 升级高版本python3.7后yum不能使用的问题 参考文章: (1)解决linux 升级高版本python3.7后yum不能使用的问题 (2)https://www.cnblogs. ...

  6. 使用Aspose.Cell控件实现Excel高难度报表的生成(三)

    在之前几篇文章中,介绍了关于Apsose.cell这个强大的Excel操作控件的使用,相关文章如下: 使用Aspose.Cell控件实现Excel高难度报表的生成(一) 使用Aspose.Cell控件 ...

  7. 【通知】2020年有三AI-CV夏季划升级,更多项目,更高难度,更加落地

    有三AI CV夏季划发布于2019年6月10日,是有三亲自带领的师徒学习季划,为已经在计算机视觉领域,但是项目经验欠缺,落地能力较差的朋友准备.2020年6月20日起将进行升级,增加更多的项目,更高的 ...

  8. 我的世界服务器修改末地难度,涨姿势啦!我的世界老司机带你解锁进入末地的高难度姿势!...

    我的世界中国版从发布至今已经有八年的时光了,很多玩家从一开始就陪着我的世界成长,可以说是看着它长大的了.如果你是我的世界的忠实玩家,那么你肯定知道进入末地的唯一渠道就是末地门啦,但是坏坏今天来就是来告 ...

  9. 解决VS在高DPI下设计出的Winform程序界面变形问题

    解决VS在高DPI下设计出的Winform程序界面变形问题 参考文章: (1)解决VS在高DPI下设计出的Winform程序界面变形问题 (2)https://www.cnblogs.com/BenP ...

最新文章

  1. makefile清除目标文件的规则
  2. php 删除子字符串函数,PHP删除字符串中的任何字符函数
  3. pythonalert弹窗_python+selenium八:Alert弹窗
  4. linux设备驱动归纳总结(五):3.操作硬件——IO静态映射【转】
  5. 快速搭建实验环境:使用 Terraform 部署 Proxmox 虚拟机
  6. 从阿里、微软、AWS财报看评云计算发展
  7. 花书+吴恩达深度学习(三)反向传播算法 Back Propagation
  8. Unity敏感词屏蔽
  9. northwind数据库mysql下载_SQLEXPRESS 2012 安装NorthWind和Pub数据库
  10. 浅谈企业信息化的过程与阶段
  11. 有限域(2)——理想和商环
  12. 【Java毕设】基于SpringBoot实现新冠疫情统计系统(Idea+Navicat)
  13. 暗棋单机版_中国象棋暗棋下载_中国象棋暗棋安卓版下载 v1.6.8 安卓单机版_飞飞巴士下载...
  14. 互联网公司招聘--奇虎360--技术类--2013年笔试题
  15. 清除bios密码的N种方法
  16. Arduino开发之Relay Module
  17. PTA 07-图6 旅游规划 (25分)
  18. matlab中提供滤波器的种类有,滤波器有哪些类型?滤波器分类
  19. centos7、8安装gcc
  20. 基于浏览器的组态绘图工具

热门文章

  1. eclipse如何部署到tomcat上的
  2. 枚举值转换(字符串转换为枚举和整数转换为枚举)
  3. Java script第二课
  4. SQL2008R2 不支持用该后端版本设计数据库关系图或表
  5. java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...
  6. HDU 5514 Frogs (容斥原理+因子分解)
  7. css cursor 的可选值(鼠标的各种样式)
  8. adult道具项目开发 - 模式
  9. CentOSserverMysql主从复制集群结构
  10. ASP.NET-get与post模式的区别