Sql Server统计报表案例
场景:查询人员指定年月工作量信息
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统计报表案例相关推荐
- mysql小计_Mysql必读用SQL实现统计报表中的小计与合计的方法详解
<Mysql必读用SQL实现统计报表中的"小计"与"合计"的方法详解>要点: 本文介绍了Mysql必读用SQL实现统计报表中的"小计&qu ...
- mysql 合计 小计_用SQL实现统计报表中的小计与合计的方法详解
本篇文章是对使用SQL实现统计报表中的"小计"与"合计"的方法进行了详细的分析介绍,需要的朋友参考下 客户提出需求,针对某一列分组加上小计,合计汇总.网上找了一 ...
- SQL Server统计信息:问题和解决方式
SQL Server统计信息:问题和解决方式 参考文章: (1)SQL Server统计信息:问题和解决方式 (2)https://www.cnblogs.com/yutingliuyl/p/7257 ...
- IIS 7上安装SQL SERVER 2005报表服务可能导致不能正常连接
前段时间一直在研究SCOM 2007的报表功能,在POC里测试时候遇到一些问题,本打算装最新的产品WINDOWS SERVER 2008+SQL SERVER 2008+SCOM 2007.只是发现S ...
- SQL Server 连接超时案例一则
原文:SQL Server 连接超时案例一则 上周六,一工厂系统管理员反馈一数据库连接不上,SSMS连接数据库报"连接超时时间已到.在尝试使用预登录握手确认时超过了此超时时间.......& ...
- 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 ...
- Always On可用性组中SQL Server统计信息
SQL Server统计信息简介 (Introduction to SQL Server Statistics) SQL Server Statistics are an essential part ...
- SQL Server统计信息以及如何在SQL中执行更新统计信息
This article gives a walk-through of SQL Server Statistics and different methods to perform SQL Serv ...
- t–sql pl–sql_不正确SQL Server统计信息– SQL查询性能的杀手–基本知识
t–sql pl–sql 什么是SQL Server统计信息? (What are SQL Server statistics?) SQL Server statistics are a collec ...
最新文章
- [Flash开发笔记] 关于Flash中的ASO文件
- 递归求解并生成哈夫曼编码的代码实现
- jquery.zSlide.js-基于CSS3/HTML5演示文档jQuery插件
- pycharm中出现pytest_在 pycharm 里通过 pytest 运行用例,控制台没有输出日志信息
- leetcode632. 最小区间(堆+多指针)
- 机器学习 —— 基础整理(二)朴素贝叶斯分类器;文本分类的方法杂谈
- Python基本操作(四) 循环与判断
- java开发cms视频教程下载地址_Java + MySQL 开发CMS系统实例教程
- hikaricp 连接池分析_Spring Boot如何使用HikariCP连接池详解
- BZOJ 2006 NOI2010 超级钢琴 划分树+堆
- mapgis新手教程(非常适合新手参考)
- 基于神经网络的毕设题目_《基于神经网络的图像识别方法研究》毕业设计方案.pdf...
- Linux文件其他操作
- layui合并单元格(此方式适用于没有列冻结的单元格合并)
- easyUI非常迷惑性的bug:分页插件点击下一页和尾页后,发送两次请求,第二次请求回跳转到第一页
- 5分钟学废携程出品配置中心阿波罗的原理与搭建
- 串ababaaababaa的next和串ababaabab的nextval
- Codeforces 777D Cloud of Hashtags(思维 + 暴力)
- 正交投影变换与透视投影
- 概率函数(密度函数)
热门文章
- android google 下拉刷新 csdn,android SwipeRefreshLayout google官方下拉刷新控件
- OpenCV+python:分水岭算法
- Linux数组计算平均值,从数组中读取并计算平均值
- php利用上传文件,如何利用PHP上传文件
- video怎么重新加载 vue_vue.js中vue-video-player中的怎么插入多个视频,视频可以同时播放的问题及解决办法...
- java url路径包含中文_谈谈 Java 类加载机制
- 虚拟服务器磁盘满了咋办,虚拟主机磁盘空间不够用怎么办?
- idea mybatis plus 代码生成插件_妙啊,Mybatis从浅入深-Plus(IDEA版通俗易懂)
- 使用Python,OpenCV捕获关键事件,并进行视频剪辑
- Python 比较俩张图片差异