场景:查询人员指定年月工作量信息

USE [Test]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER  procedure [dbo].[GetWorkLoadMain]
@year int,
@month int,
@UserId varchar(50)
as
begindeclare @day varchar(50)set @day=CAST(@year as varchar)+'-'+RIGHT(('00'+cast(@month as varchar)),2)+'-01'declare @sql varchar(max)
set @sql=''select @sql=@sql+',['+Rtrim(ProjectName)+'] int NULL DEFAULT 0  '  from
( select distinct ProjectName from ProRecord  where TypeCode=0 and year(InsertTime)=@year  and month(InsertTime)=@month  ) t
set @sql=stuff( @sql,1,1,'') create table  #temp (日期 varchar(50))declare @count intset @count=(select COUNT(1) from ProRecord  where TypeCode=0 and year(InsertTime)=@year  and month(InsertTime)=@month )if @count>0beginexec (' alter table  #temp   add  '+@sql+'')endinsert into #temp(日期)
select convert(varchar(10),dateadd(dd,number,convert(varchar(8),@day,120)+'01'),120) as time
from master..spt_values
where type='P' and
dateadd(dd,number,convert(varchar(8),@day,120)+'01')<=dateadd(dd,-1,convert(varchar(8),dateadd(mm,1,@day),120)+'01')declare @日期  varchar(50)
declare @ProjectName  varchar(50)
declare @num int
declare @ru1 varchar(50)
if(ISNULL(@UserId,'')<>'') begindeclare mycursor cursor for select CONVERT(varchar(10),InsertTime,23) as 日期,ProjectName, count(1) as num from ProRecord where UserId= @UserId and TypeCode=0 and year(InsertTime)=@year  and month(InsertTime)=@month group by CONVERT(varchar(10),InsertTime,23) ,ProjectNameend
elsebegindeclare mycursor cursor for select CONVERT(varchar(10),InsertTime,23) as 日期,ProjectName, count(1) as num from ProRecord where TypeCode=0 and year(InsertTime)=@year  and month(InsertTime)=@month group by CONVERT(varchar(10),InsertTime,23) ,ProjectNameendopen mycursor
fetch next from mycursor into @日期,  @ProjectName,@num
while (@@fetch_status=0)
begin      set  @ru1 =Rtrim(@ProjectName) exec ('update #temp set ['+@ru1+']='+@num+'  where 日期='+''''+@日期+''''+'  ' )fetch next from mycursor into  @日期,  @ProjectName, @num
end
close mycursor  DEALLOCATE mycursor   end declare @sqlnew varchar(8000)
set @sqlnew=''
select @sqlnew=@sqlnew+',sum(cast('+name+' as int)) as '+name from tempdb.dbo.syscolumns where id=object_id('tempdb.dbo.#temp') and name not in('日期') order by colid     --写不要汇总的列名exec ('select * from #temp  where 1=1  union all select ''合计'' as 日期'+@sqlnew+' from #temp  ')--exec [GetWorkLoadMain] 2017,6,''
--exec [GetWorkLoadMain] 2017,6,'admin'

呈现效果:

分析:

1.行转列

declare @sql varchar(max)
set @sql=''select @sql=@sql+',['+Rtrim(ProjectName)+'] int NULL DEFAULT 0 ' from
( select distinct ProjectName from ProRecord where TypeCode=0 and year(InsertTime)=@year and month(InsertTime)=@month ) t
set @sql=stuff( @sql,1,1,'')create table #temp (日期 varchar(50))
exec (' alter table #temp add '+@sql+'')

2.查询当前日期所在月份所有日期

select convert(varchar(10),dateadd(dd,number,convert(varchar(8),'2017-06-01',120)+'01'),120) as time
from master..spt_values
where type='P' and
dateadd(dd,number,convert(varchar(8),'2017-06-01',120)+'01')<=dateadd(dd,-1,convert(varchar(8),dateadd(mm,1,'2017-06-01'),120)+'01')

3.游标处理数据

declare @日期 varchar(50)
declare @ProjectName varchar(50)
declare @num int
declare @ru1 varchar(50)
declare mycursor cursor for select CONVERT(varchar(10),InsertTime,23) as 日期,ProjectName, count(1) as num from ProRecord where UserId= @UserId and TypeCode=0 and year(InsertTime)=@year and month(InsertTime)=@month group by CONVERT(varchar(10),InsertTime,23) ,ProjectName
open mycursor
fetch next from mycursor into @日期, @ProjectName,@num
while (@@fetch_status=0)
begin
set @ru1 =Rtrim(@ProjectName)
exec ('update #temp set ['+@ru1+']='+@num+' where 日期='+''''+@日期+''''+' ' )
fetch next from mycursor into @日期, @ProjectName, @num
end
close mycursorDEALLOCATE mycursorend

4.对动态列临时表进行汇总查询

注意:对于临时表,查询需加前缀 tempdb

declare @sqlnew varchar(8000)
set @sqlnew=''
select @sqlnew=@sqlnew+',sum('+name+' )  as '+name from tempdb.dbo.syscolumns where id=object_id('tempdb.dbo.#temp') and name not in('日期') order by colid --写不要汇总的列名exec ('select ''合计'' as 日期'+@sqlnew+' from #temp ')

转载于:https://www.cnblogs.com/byfcumt/p/6929357.html

Sql Server统计报表案例相关推荐

  1. mysql小计_Mysql必读用SQL实现统计报表中的小计与合计的方法详解

    <Mysql必读用SQL实现统计报表中的"小计"与"合计"的方法详解>要点: 本文介绍了Mysql必读用SQL实现统计报表中的"小计&qu ...

  2. mysql 合计 小计_用SQL实现统计报表中的小计与合计的方法详解

    本篇文章是对使用SQL实现统计报表中的"小计"与"合计"的方法进行了详细的分析介绍,需要的朋友参考下 客户提出需求,针对某一列分组加上小计,合计汇总.网上找了一 ...

  3. SQL Server统计信息:问题和解决方式

    SQL Server统计信息:问题和解决方式 参考文章: (1)SQL Server统计信息:问题和解决方式 (2)https://www.cnblogs.com/yutingliuyl/p/7257 ...

  4. IIS 7上安装SQL SERVER 2005报表服务可能导致不能正常连接

    前段时间一直在研究SCOM 2007的报表功能,在POC里测试时候遇到一些问题,本打算装最新的产品WINDOWS SERVER 2008+SQL SERVER 2008+SCOM 2007.只是发现S ...

  5. SQL Server 连接超时案例一则

    原文:SQL Server 连接超时案例一则 上周六,一工厂系统管理员反馈一数据库连接不上,SSMS连接数据库报"连接超时时间已到.在尝试使用预登录握手确认时超过了此超时时间.......& ...

  6. sql server 统计_看SQL Server 2016中的新实时查询统计信息

    sql server 统计 With the release of SQL Server 2016 also comes a great new feature to get a live view ...

  7. Always On可用性组中SQL Server统计信息

    SQL Server统计信息简介 (Introduction to SQL Server Statistics) SQL Server Statistics are an essential part ...

  8. SQL Server统计信息以及如何在SQL中执行更新统计信息

    This article gives a walk-through of SQL Server Statistics and different methods to perform SQL Serv ...

  9. t–sql pl–sql_不正确SQL Server统计信息– SQL查询性能的杀手–基本知识

    t–sql pl–sql 什么是SQL Server统计信息? (What are SQL Server statistics?) SQL Server statistics are a collec ...

最新文章

  1. [Flash开发笔记] 关于Flash中的ASO文件
  2. 递归求解并生成哈夫曼编码的代码实现
  3. jquery.zSlide.js-基于CSS3/HTML5演示文档jQuery插件
  4. pycharm中出现pytest_在 pycharm 里通过 pytest 运行用例,控制台没有输出日志信息
  5. leetcode632. 最小区间(堆+多指针)
  6. 机器学习 —— 基础整理(二)朴素贝叶斯分类器;文本分类的方法杂谈
  7. Python基本操作(四) 循环与判断
  8. java开发cms视频教程下载地址_Java + MySQL 开发CMS系统实例教程
  9. hikaricp 连接池分析_Spring Boot如何使用HikariCP连接池详解
  10. BZOJ 2006 NOI2010 超级钢琴 划分树+堆
  11. mapgis新手教程(非常适合新手参考)
  12. 基于神经网络的毕设题目_《基于神经网络的图像识别方法研究》毕业设计方案.pdf...
  13. Linux文件其他操作
  14. layui合并单元格(此方式适用于没有列冻结的单元格合并)
  15. easyUI非常迷惑性的bug:分页插件点击下一页和尾页后,发送两次请求,第二次请求回跳转到第一页
  16. 5分钟学废携程出品配置中心阿波罗的原理与搭建
  17. 串ababaaababaa的next和串ababaabab的nextval
  18. Codeforces 777D Cloud of Hashtags(思维 + 暴力)
  19. 正交投影变换与透视投影
  20. 概率函数(密度函数)

热门文章

  1. android google 下拉刷新 csdn,android SwipeRefreshLayout google官方下拉刷新控件
  2. OpenCV+python:分水岭算法
  3. Linux数组计算平均值,从数组中读取并计算平均值
  4. php利用上传文件,如何利用PHP上传文件
  5. video怎么重新加载 vue_vue.js中vue-video-player中的怎么插入多个视频,视频可以同时播放的问题及解决办法...
  6. java url路径包含中文_谈谈 Java 类加载机制
  7. 虚拟服务器磁盘满了咋办,虚拟主机磁盘空间不够用怎么办?
  8. idea mybatis plus 代码生成插件_妙啊,Mybatis从浅入深-Plus(IDEA版通俗易懂)
  9. 使用Python,OpenCV捕获关键事件,并进行视频剪辑
  10. Python 比较俩张图片差异