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-23 19:06:27

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

SqlServer使用 case when 解决多条件模糊查询问题_MsSql

我们在进行项目开发中,经常会遇到多条件模糊查询的需求.对此,我们常见的解决方案有两种:一是在程序端拼接SQL字符串,根据是否选择了某个条件,构造相应的SQL字符串:二是在数据库的存储过程中使用动态的SQL语句.其本质也是拼接SQL字符串,不过是从程序端转移到数据库端而已. 这两种方式的缺点是显而易见的:一是当多个条件每个都可为空时,要使用多个if语句进行判断:二是拼接的SQL语句容易产生SQL注入漏洞. 最近写数据库存储过程的时候经常使用case when 语句,正好可以用这个语句解决一下以上问

SqlServer使用 case when 解决多条件模糊查询问题

我们在进行项目开发中,经常会遇到多条件模糊查询的需求.对此,我们常见的解决方案有两种:一是在程序端拼接SQL字符串,根据是否选择了某个条件,构造相应的SQL字符串:二是在数据库的存储过程中使用动态的SQL语句.其本质也是拼接SQL字符串,不过是从程序端转移到数据库端而已. 这两种方式的缺点是显而易见的:一是当多个条件每个都可为空时,要使用多个if语句进行判断:二是拼接的SQL语句容易产生SQL注入漏洞. 最近写数据库存储过程的时候经常使用case when 语句,正好可以用这个语句解决一下以上问

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

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

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

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

使用asp.net将图片上传并存入SqlServer中,然后从SqlServer中读取并显示出来

asp.net|server|sqlserver|上传|显示 1,使用asp.net将图片上传并存入SqlServer中,然后从SqlServer中读取并显示出来一,上传并存入SqlServer 数据库结构  create table test  {     id identity(1,1),     FImage image  }  相关的存储过程  Create proc UpdateImage  (     @UpdateImage Image  )  As  Insert Into te

sqlserver-同样SQL语句使用SQLserver跟access数据库,SQLserver可以进行增删改,而access不能

问题描述 同样SQL语句使用SQLserver跟access数据库,SQLserver可以进行增删改,而access不能 同样的SQL语句,在一SQL server做后台数据库可以实现增删改,而使用access数据库就无法实现,在未关闭自己写的程序,再次查询时,使用access数据库可以再程序中看到增删改的效果,只是在access数据库内就没有数据改动.咋么回事? 解决方案 你看连接字符串,程序操作的access文件和你打开的不是用一个文件

第十七章——配置SQLServer(1)——为SQLServer配置更多的处理器

原文:第十七章--配置SQLServer(1)--为SQLServer配置更多的处理器 前言:         SQLServer提供了一个系统存储过程,SP_Configure,可以帮助你管理实例级别的配置.微软建议使用默认配置,但是基于不同的服务器.不同负载的系统和你的用法,更改配置可能会给你的性能带来好处.在32位和64位系统中,sp_configure会有一些差异.         我们经常见到SQLServer所在的服务器上还包含了如IIS.文件服务器或者域控制器这些服务或者功能.这些

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

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

select-两个表中数据分类汇总合并的问题

问题描述 两个表中数据分类汇总合并的问题 我有两个表,表中各有一个类型字段,名称字段,数值字段,例 如下:表1:类型 名称 数值文具 铅笔 2耗材 纸 10表2类型 名称 数值文具 铅笔 1耗材 纸 1表1存的是采购计划数据,表2存的是采购数据我现在需要将两表的各自分类数据汇总后进行输出 类型 名称 采购计划数 采购数文具 铅笔 2 1耗材 纸 10 1 现在的写法怎么写数据都出现了交叉,请大神讲讲!select 该 怎么写? 解决方案 select 类型名称sum(采购计划数) as 采购计划