当前位置: 代码网 > it编程>数据库>MsSqlserver > MS SQL Server STUFF实现统计记录行转为列显示

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

2024年05月26日 MsSqlserver 我要评论
范例运行环境操作系统: windows server 2019 datacenter数据库:microsoft sql server 2016视图样本设计假设某一视图 [v_pj_rep1_lname

范例运行环境

操作系统: 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 行转为列内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com