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

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 ')

最新文章

  1. 10 Things Every Java Programmer Should Know about String
  2. 【POJ 3041】Asteroids (最小点覆盖)
  3. MySQL(MariaDB)的 SSL 加密复制
  4. DBLink创建 ORA-12154: TNS: 无法解析指定的连接标识符
  5. java之trycatchfinally代码块与return,throw的执行顺序的探索
  6. CF 577B Modulo Sum
  7. [RxJS] Observables can complete
  8. MFC圆角背景移动边角底色毛刺解决方案
  9. java.lang.RuntimeException: java.lang.NoSuchMethodException:
  10. sys.argv[]用法-转载
  11. Android的颜色值转换
  12. IntelliJ IDEA 2018 最新版注册码
  13. oracle 查询所有约束
  14. mfcc的特征提取python 代码实现和解析
  15. 关于商米D1S,USB默认权限在关机后丢失的FAQ
  16. animate方法使用总结
  17. Java SE之装箱与拆箱【基本数据类型的包装类/==与equals方法】
  18. Consul之:服务健康监测
  19. ubuntu编译centos7部署大象医生 dr-elephant
  20. HDU4734——2013 ACM/ICPC Asia Regional Chengdu Online

热门文章

  1. 20155307 2016-2017 《Java程序设计》第三次实验报告
  2. 20155334 2016-2017-2《Java程序设计》课程总结
  3. GDAL中通过GDALDriver类的Create函数实现图像的保存
  4. 【洛谷P4178】Tree
  5. 【JUC源码解析】ConcurrentLinkedQueue
  6. javaweb(三十七)——获得MySQL数据库自动生成的主键
  7. 强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods)
  8. info信息的获取
  9. robotframework 脚本编写规范
  10. python爬虫入门之URL