SQLServer---使用Case When解决SQLServer数据分类汇总问题

SQLServer---使用Case When解决SQLServer数据分类汇总问题

近半年一直在负责某市的人事档案管理系统的后期开发和维护工作,之前客户给了一张如下图的表格,需要我去汇总数据,然后填充到表格中。

具体的需求:统计出每一个工作人员在某一段时间内分别打印了多少张不同的信函(或报表)。

最初的想法

1、  查出使用该系统的工作人员

select realName as '姓名' from T_User
where
userID in(select distinct userID from T_OperationLog);

运行结果:

2、  分别查出不同员工打印的不同信函的数量(下面以干部介绍信为例)

select realName as '姓名', COUNT(*) as '干部介绍信' from T_LettersRecord as l,T_User as u
where
l.userID=u.userID and letterType = '干部介绍信' and l.userID in(select distinct userID from T_OperationLog)
group by  l.userID,u.realName;

运行结果:

但是这个时候有一个问题我们统计一种类型的信函的时候COUNT(*)就行了,但是当我们我们要统计其他信函的时候我们该怎么使用COUNT函数呢?与此同时letterType(信函类型)作为一个条件也是不同的。

作为一个菜鸟我最先想到的不是SqlServer中一大堆你牛逼的函数而是想先用一个类似于数组的东西将letterType都存进去,在SQLServer中不支持数据于是我用了变量表去实现类似的功能。

--声明一个表变量
declare @t table (id int,name varchar(20))
insert into @t values(1,'干部介绍信')
insert into @t values(2,'存档证明信')
select  realName as '姓名' ,count(*)
from T_LettersRecord as l,T_User as u
where l.userID=u.userID and  letterType in(select name from @t) and l.userID in(select distinct userID
from T_OperationLog)  group by  l.userID,u.realName,letterType

运行结果:

从运行结果中我们可以看出,最终的结果是竖排的并不是我想要的横排效果,于是问题就又出来了如何让它有横排的效果。我想到了用左连接(left join … on),将每次查出的结果都存到一个临时表中,然后将将这些临时表依次用left join … on最终得出我想要的结果。

实际的做法

上面的那个想法在我想出的那一瞬间就被我否定了,这样又是循环,又是连接查询效率就会很慢而且后来的人维护起来也比较麻烦。在同事的提醒下,我使用了case when解决了这个问题。

最终代码如下:

select realName as '姓名',
    COUNT(case when letterType='干部介绍信' then '1' end) as '干部介绍信',
    COUNT(case when letterType='转递档案通知单' then '1' end)as '转档通知单',
    .
    .
    .
    COUNT(case when letterType='职称审批表' then '1' end) as '职称审批表',
    COUNT(case when letterType='党员信息表' then '1' end) as '党员信息表',
    COUNT(case when letterType='其他' then '1' end) as '其他'
from T_LettersRecord as l,T_User as u
where l.userID=u.userID and l.userID in(select distinct userID
from T_OperationLog) group by  l.userID,u.realName;

最终的运行结果:

完全的符合用户最终的要求。在写这段代码之前也问过旁边的一个同事,她的第一反应就是不会,这样的结果就是她真的不会了,其实要是想任务分解就像我最初的想法那样也是能够写出了,写出来之后优化肯定又是另一种感觉了(遇到问题先尝试一下总是对的)。

下一篇博文会介绍一下case…when…的具体用法。

时间: 2024-10-09 16:08:03

SQLServer---使用Case When解决SQLServer数据分类汇总问题的相关文章

问题:sqlserver if;结果: SqlServer if else和case

SqlServer if else和case 分类: SQLSERVER 2013-03-01 16:51 11328人阅读 评论(0) 收藏 举报 行转列 目录(?)[+] if else 要提示的是,写语句的时候 单引号的引用:用到单引号的一律两个单引号代替 [sql] view plaincopy USE [a] GO /****** Object:  StoredProcedure [a].[Processname]    Script Date: 02/24/2011 11:49:55

解决 SqlServer执行脚本,文件过大,内存溢出问题

原文:解决 SqlServer执行脚本,文件过大,内存溢出问题 执行.sql脚本文件,如果文件较大时,执行会出现内存溢出问题,可用命令替代 cmd 中输入 osql -S 127.0.0.1,8433 -U sa -P sa -i d:\sql.sql ,-S 服务器名 -U 用户名 -P 密码 -i 文件地址,等待执行完毕即可 以上在sql2008R2下执行通过 如果数据库是 sql2008的 请将 osql 修改成为 sqlcmd 即可

程序猿是如何解决SQLServer占CPU100%的

原文:程序猿是如何解决SQLServer占CPU100%的 文章目录 遇到的问题 使用SQLServer Profiler监控数据库 SQL1:查找最新的30条告警事件 SQL2:获取当前的总报警记录数 有哪些SQL语句会导致CPU过高? 查看SQL的查询计划 选择top记录时,尽量为order子句的字段建立索引 查看SQL语句CPU高的语句 通过建立相关索引来减少表扫描 其他优化手段 总结 遇到的问题 有同事反应服务器CPU过高,一看截图基本都是100%了,my god,这可是大问题,赶紧先看

解决SqlServer中Collate冲突的问题

使用Sql连表查询的时候会遇到Collate冲突的问题,比如: select id,Name from [dbo].VMImage union select id,Name from [dbo].[DicVMImage] 得到的Error: Msg 468, Level 16, State 9, Line 1 Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_Latin1_Ge

解决SQLSERVER数据库表被琐死!

--杀死全部锁死进程ALTER Proc Sp_KillAllProcessInDB@DbName VarChar(100)asif db_id(@DbName) = NullbeginPrint 'DataBase dose not Exist'endelse BeginDeclare @spId Varchar(30) DECLARE TmpCursor CURSOR FORSelect 'Kill ' + convert(Varchar, spid) as spIdfrom master.

解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-source-for-stored-procedures/ 目前我正在扩展OrcaMDF Studio的功能 不单只支持系统表,DMVs 和用户表 而且也要支持存储过程.那很容易,我们只需要查询sys.procedures --或者查询sys.sysschobjs, 因为当SQLSERVER没有在运行的时候我

IE6 Bug解决方法HACK汇总

1.终极方法:条件注释<!--[if lte IE 6]> 这段文字仅显示在 IE6及IE6以下版本. <![endif]--><!--[if gte IE 6]> 这段文字仅显示在 IE6及IE6以上版本. <![endif]--><!--[if gt IE 6]> 这段文字仅显示在 IE6以上版本(不包含IE6). <![endif]--><!--[if IE 5.5]> 这段文字仅显示在 IE5.5. <![e

无法启动MYSQL服务”1067 进程意外终止”解决的方法——汇总及终极方法

自己一開始依照百度经验里的方法--<MySQL下载安装.配置与使用(win7x64)>去安装和配置,可是到后面步骤总是出现1067代号的错误. 慢慢折腾去解决. 这里汇总各种导致mysql提示无法启动MYSQL服务"1067 进程意外终止"的一些解决的方法.自己遇到这个问题是查了非常多方法不行,最后看到一个论坛的讨论.试了一下居然能够.一下是网上的部分方法.最后能够的那个方法我放在最后面: 启用MySql服务的时候出现"windows无法启动mysql服务(位于本

解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)

原文:解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译) 解剖SQLSERVER 第十一篇    对SQLSERVER的多个版本进行自动化测试(译) http://improve.dk/automated-testing-of-orcamdf-against-multiple-sql-server-versions/ 自从我发布了OrcaMDF Studio,我已经意识到SQL2005和SQL2008之间的一些系统表的差异. 这些差异导致OrcaMDF 解析失败