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
begin
declare @day varchar(50)
set @day=CAST(@year as varchar)+'-'+RIGHT((''+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 int
set @count=(select COUNT(1) from ProRecord where TypeCode=0 and year(InsertTime)=@year and month(InsertTime)=@month )
if @count>0
begin
exec (' alter table #temp add '+@sql+'')
end insert into #temp(日期)
select convert(varchar(10),dateadd(dd,number,convert(varchar(8),@day,120)+''),120) as time
from master..spt_values
where type='P' and
dateadd(dd,number,convert(varchar(8),@day,120)+'')<=dateadd(dd,-1,convert(varchar(8),dateadd(mm,1,@day),120)+'') declare @日期 varchar(50)
declare @ProjectName varchar(50)
declare @num int
declare @ru1 varchar(50)
if(ISNULL(@UserId,'')<>'')
begin
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
end
else
begin
declare 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) ,ProjectName
end 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 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)+''),120) as time
from master..spt_values
where type='P' and
dateadd(dd,number,convert(varchar(8),'2017-06-01',120)+'')<=dateadd(dd,-1,convert(varchar(8),dateadd(mm,1,'2017-06-01'),120)+'')
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 mycursor DEALLOCATE mycursor end
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 ')
Sql Server统计报表案例的更多相关文章
- 用SQL实现统计报表中的"小计"与"合计"的方法详解
本篇文章是对使用SQL实现统计报表中的"小计"与"合计"的方法进行了详细的分析介绍,需要的朋友参考下 客户提出需求,针对某一列分组加上小计,合计汇总.网上找 ...
- SQL Server统计信息:问题和解决方式
在网上看到一篇介绍使用统计信息出现的问题已经解决方式,感觉写的很全面. 在自己看的过程中顺便做了翻译. 因为本人英文水平有限,可能中间有一些错误. 假设有哪里有问题欢迎大家批评指正.建议英文好的直接看 ...
- SQL Server 连接问题案例解析(1)
SQL Server 连接问题案例解析(1) 转载自:http://blogs.msdn.com/b/apgcdsd/archive/2015/04/27/sql.aspx?CommentPosted ...
- SQL SERVER统计服务器所有的数据库(数据库文件)、表(表行数)、字段(各字段)等详细信息
原文:SQL SERVER统计服务器所有的数据库(数据库文件).表(表行数).字段(各字段)等详细信息 USE STAT GO SET NOCOUNT ON IF EXISTS(SELECT 1 FR ...
- 全废话SQL Server统计信息(2)——统计信息基础
接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958 我想在大地上画满窗子,让所有习惯黑暗的眼睛都习惯光明--顾城<我是一个 ...
- 全废话SQL Server统计信息(1)——统计信息简介
当心空无一物,它便无边无涯.树在.山在.大地在.岁月在.我在.你还要怎样更好的世界?--张晓风<我在> 为什么要写这个内容? 随着工作经历的积累,越来越感觉到,大量的关系型数据库的性能问题 ...
- SQL Server 2008 报表服务入门【转】
转http://www.cnblogs.com/YZDONET/archive/2012/08/17/2644711.html 概述 上周,Tim与我们分享了SQL Server 2008 报表服务的 ...
- SQL Server 统计信息
SELECT * FROM SYS.stats _WA_Sys_00000009_00000062:统计对象的名称.不同的机器名称不同,自动创建的统计信息都以_WA_Sys开头,00000009表示的 ...
- SQL SERVER 统计信息概述(Statistics)
前言 查询优化器使用统计信息来创建可提高查询性能的查询计划,对于大多数查询,查询优化器已经为高质量查询计划生成必要的统计信息,但是在少数情况下,您需要创建附加的统计信息或者修改查询设计以得到最佳结果. ...
随机推荐
- Oracle入门第四天(下)——约束
一.概述 1.分类 表级约束主要分为以下几种: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK 2.注意事项 如果不指定约束名 ,Oracle server ...
- hadoop deployment
本文主要是以安装和使用hadoop-0.12.0为例,指出在部署Hadoop的时候容易遇到的问题以及如何解决. 硬件环境共有3台机器,均使用的FC5系统,Java使用的是jdk1.6.0.IP配置如下 ...
- [BZOJ4011][HNOI2015]落忆枫音-[dp乱搞+拓扑排序]
Description 传送门 Solution 假如我们的图为DAG图,总方案数ans为每个点的入度In相乘(不算1号点).(等同于在每个点的入边选一条边,最后一定构成一棵树). 然而如果加了边x- ...
- 【BZOJ3527】[ZJOI3527]力
[BZOJ3527][ZJOI3527]力 题面 bzoj 洛谷 题解 易得 \[ E_i=\sum_{j<i}\frac{q_j}{(i-j)^2}-\sum_{j>i}\frac{q_ ...
- MySQL入门篇(六)之mysqldump备份和恢复
一.备份单个数据库 1.备份命令:mysqldump MySQL数据库自带的一个很好用的备份命令.是逻辑备份,导出 的是SQL语句.也就是把数据从MySQL库中以逻辑的SQL语句的形式直接输出或生成备 ...
- OpenStack入门篇(八)之镜像服务Glance
一.Glance的概述 Glance是为虚拟机的创建提供镜像的服务,我们基于Openstack是构建基本的IaaS平台对外提供虚拟机,而虚拟机在创建时必须为选择需要安装的操作系统,Glance服务就是 ...
- iOS 影音新格式 HEIF HEVC
苹果在 iOS 11 的发布会上,推出了两种新的媒体格式 HEIF HEVC,都是为了保证画质的情况下,大大减少视频.照片的大小. 一.简介 HEVC全称 High Efficiency Video ...
- mybatis逆向工程 mbg运行java代码时提示找不到MBG.xml的解决方法
这里要写全路径才能找到文件
- Python3中IO文件操作的常见用法
首先创建一个文件操作对象: f = open(file, mode, encoding) file指定文件的路径,可以是绝对路径,也可以是相对路径 文件的常见mode: mode = “r” # ...
- 关于C语言中内存的3个问题
1.程序为什么需要内存? 计算机程序 = 代码 + 结果,从宏观上理解,代码就是动作,而数据被动作加工,最终返回结果.程序是被放在内存中运行的,并且需要内存来存储一些临时变量,因此,对于程序来说,内存 ...