MS SQL Server STUFF实现统计记录行转为列显示

 更新时间:2024年04月09日 09:24:16   作者: 初九之潜龙勿用  
SQL语句行转列函数是一种用于将多个行数据转换为一列的函数,本文主要介绍了MS SQL Server STUFF实现统计记录行转为列显示,具有一定的参考价值,感兴趣的可以了解一下

范例运行环境

操作系统: Windows Server 2019 DataCenter

数据库:Microsoft SQL Server 2016

视图样本设计

假设某一视图 [v_pj_rep1_lname_score] 可查询对某一被评价人的绩效指标的打分情况,并按评价人的职务进行分类, 设计如下:

序号字段名类型说明备注
1projectciduniqueidentifier项目ID
2wxmpciduniqueidentifier被评价人ID
3count_sortidtinyint评价人职级排序号数值越小职务越高
4lnamenvarchar评价人职务
5rsint评价人总数
6scoredecimal评价人总分所有评价人给被评价人打分的总和
7score2decimal评价人平均得分所有评价人给被评价人打分的总和除以总人数的平均分

查询分析器结果数据显示如下图:

/****** SSMS 的 SelectTopNRows 命令的脚本  ******/
SELECT  [projectcid]
      ,[wxmpcid]
      ,[count_sortid]
      ,[lname]
      ,[rs]
      ,[score]
      ,[score2]
  FROM [v_pj_rep1_lname_score] order by projectcid,wxmpcid,count_sortid

如图我们对项目ID、被评价人ID、评价人职务排序号进行排序,可以看到职务越高排位越靠前。

数据统计要求

假设统计视图名 [v_pj_rep1_lname_score_count] 可查询对某一被评价人的所有被评价人统计描述(如人员人数情况、每类人打分情况等),即将视图设计样本的行数据变为列进行显示, 统计表设计如下:

序号字段名类型说明备注
1projectciduniqueidentifier项目ID
2wxmpciduniqueidentifier被评价人ID
3scoredecimal被评价人权重分1总人数的平均分*20%
4score2decimal被评价人权重分2总人数的平均分*20%*30%
5dnamenvarchar统计显示将行数据变为列数据,显示统计详情信息

查询分析器结果数据显示如下图:

如图第一行数据 dname 列返回 “董事长88.21分,总经理100.00分,分协管领导92.23分,其他领导91.79分,部门职工(2人,总分187.65分)93.83分” ,该列会显示各职务打分的人数,总分及平均分情况,从统计结果来看,更加直观。 

 STUFF函数实现

 示例代码如下:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE view [dbo].[v_pj_rep1_lname_score_count] as 

select projectcid,wxmpcid,round(sum(score2)*0.2,2) score,round(sum(score2)*0.2*0.3,2) score2,
STUFF(( select ','+b.lname+case when rs>1 then '('+cast(rs as varchar(20))+'人,总分'++REPLACE(cast(round(score,2) as nvarchar(20)),'0000','')+'分'+')' else '' end+REPLACE(cast(round(score2,2) as nvarchar(20)),'0000','')+'分'   
from v_pj_rep1_lname_score b 
where b.projectCid=a.projectcid and b.wxmpCid=a.wxmpCid order by count_sortid for xml path('')
),1,1,'') as dname from 
 
  v_pj_rep1_lname_score a group by projectcid,wxmpcid
GO

关键说明见下表: 

序号关键语句说明
1round(sum(score2)*0.2,2) score, round(sum(score2)*0.2*0.3,2) score2,取权重值,并使用ROUND函数取后两位小数
2

STUFF((

select ','+b.lname+case when rs>1 then '('+cast(rs as varchar(20))+'人,总分'++REPLACE(cast(round(score,2) as nvarchar(20)),'0000','')+'分'+')' else '' end+REPLACE(cast(round(score2,2) as nvarchar(20)),'0000','')+'分'   
from v_pj_rep1_lname_score b 
where b.projectCid=a.projectcid and b.wxmpCid=a.wxmpCid order by count_sortid for xml path('')
),1,1,'') as dname

使用 STUFF 函数配合 SQL 语句 FOR XML PATH 来实现行转列。

SQL语句中通过 CASE 来判断人数,大于1则显示人数和总分,否则直接显示分值,并在前面加上职务 lname 字段,并以 count_sortid 进行排序,数值越小的职务越往前排

3v_pj_rep1_lname_score a group by projectcid,wxmpcid对视图样本进行项目ID和被评价人ID进行分组统计

小结

SQL Server 中的 STUFF 函数是将字符串插入到另一个字符串中。 它从第一个字符串的开始位置删除指定长度的字符;然后将第二个字符串插入到第一个字符串的开始位置。

具体语法请参照:https://learn.microsoft.com/zh-cn/sql/t-sql/functions/stuff-transact-sql?view=sql-server-ver16&redirectedfrom=MSDN

至此STUFF的函数使用我们就介绍到这里,具体使用中我们还需要灵活掌握,对结果数据的细节可能要进一步进行处理,以满足我们的统计要求。并可设计导出到 WORD或EXCEL文件进行下载。

到此这篇关于MS SQL Server STUFF实现统计记录行转为列显示的文章就介绍到这了,更多相关SQL 行转为列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQL Server手工插入标识列的方法

    SQL Server手工插入标识列的方法

    这篇文章介绍了SQL Server手工插入标识列的方法,有需要的朋友可以参考一下
    2013-10-10
  • 优化 SQL Server 索引的小技巧

    优化 SQL Server 索引的小技巧

    SQL Server中有几个可以让你检测、调整和优化SQL Server性能的工具
    2012-08-08
  • WIN10运行SQL2000安装程序时没有反应的问题解决办法

    WIN10运行SQL2000安装程序时没有反应的问题解决办法

    Win10系统上安装2000数据库或者msde的数据库经常在打开第一步安装的时候就报错或者没有反应,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • SQL中的键与约束

    SQL中的键与约束

    本文围绕SQL约束展开,核心是通过not null、default、主键、唯一键、自增长、外键等约束类型,解决数据库数据无效、重复及表间关联混乱问题,保障数据可靠性,为数据库设计和管理提供基础指导,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-10-10
  • SQL Server数据库迁移到MySQL的完整指南

    SQL Server数据库迁移到MySQL的完整指南

    在企业应用开发中,数据库迁移是一个常见的需求,随着业务的发展,企业可能会从 SQL Server 转向 MySQL ,原因可能是成本、性能、跨平台兼容性等,本文将详细介绍如何将 SQL Server 数据库迁移到 MySQL,并提供一些实用的技巧和注意事项,需要的朋友可以参考下
    2025-02-02
  • SQL Server数据库开发的二十一条法则

    SQL Server数据库开发的二十一条法则

    如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS)。
    2010-06-06
  • MSSQL2005数据附加失败报错3456解决办法

    MSSQL2005数据附加失败报错3456解决办法

    今天在把数据库备份出去,再到另一台服务器上进行数据还原时出现,数据附加失败错误3456提示,下面来看我的解决过程
    2012-09-09
  • SqlServer 执行计划及Sql查询优化初探

    SqlServer 执行计划及Sql查询优化初探

    最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划。
    2010-05-05
  • SQL Server 查询设置  LIKE/DISTINCT/HAVING/排序详解

    SQL Server 查询设置  LIKE/DISTINCT/HAVING/排序详解

    本文介绍了在SQLServer中使用LIKE、DISTINCT、HAVING等条件语句进行复杂查询的方法,包括模糊查询、去重查询、分组过滤以及排序等技巧,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • sqlserver exists,not exists的用法

    sqlserver exists,not exists的用法

    exists,not exists的使用方法示例,需要的朋友可以参考下。
    2009-12-12

最新评论