MS SQL Server STUFF實(shí)現(xiàn)統(tǒng)計(jì)記錄行轉(zhuǎn)為列顯示
范例運(yùn)行環(huán)境
操作系統(tǒng): Windows Server 2019 DataCenter
數(shù)據(jù)庫:Microsoft SQL Server 2016
視圖樣本設(shè)計(jì)
假設(shè)某一視圖 [v_pj_rep1_lname_score] 可查詢對某一被評價(jià)人的績效指標(biāo)的打分情況,并按評價(jià)人的職務(wù)進(jìn)行分類, 設(shè)計(jì)如下:
序號 | 字段名 | 類型 | 說明 | 備注 |
---|---|---|---|---|
1 | projectcid | uniqueidentifier | 項(xiàng)目ID | |
2 | wxmpcid | uniqueidentifier | 被評價(jià)人ID | |
3 | count_sortid | tinyint | 評價(jià)人職級排序號 | 數(shù)值越小職務(wù)越高 |
4 | lname | nvarchar | 評價(jià)人職務(wù) | |
5 | rs | int | 評價(jià)人總數(shù) | |
6 | score | decimal | 評價(jià)人總分 | 所有評價(jià)人給被評價(jià)人打分的總和 |
7 | score2 | decimal | 評價(jià)人平均得分 | 所有評價(jià)人給被評價(jià)人打分的總和除以總?cè)藬?shù)的平均分 |
查詢分析器結(jié)果數(shù)據(jù)顯示如下圖:
/****** SSMS 的 SelectTopNRows 命令的腳本 ******/ SELECT [projectcid] ,[wxmpcid] ,[count_sortid] ,[lname] ,[rs] ,[score] ,[score2] FROM [v_pj_rep1_lname_score] order by projectcid,wxmpcid,count_sortid
如圖我們對項(xiàng)目ID、被評價(jià)人ID、評價(jià)人職務(wù)排序號進(jìn)行排序,可以看到職務(wù)越高排位越靠前。
數(shù)據(jù)統(tǒng)計(jì)要求
假設(shè)統(tǒng)計(jì)視圖名 [v_pj_rep1_lname_score_count] 可查詢對某一被評價(jià)人的所有被評價(jià)人統(tǒng)計(jì)描述(如人員人數(shù)情況、每類人打分情況等),即將視圖設(shè)計(jì)樣本的行數(shù)據(jù)變?yōu)榱羞M(jìn)行顯示, 統(tǒng)計(jì)表設(shè)計(jì)如下:
序號 | 字段名 | 類型 | 說明 | 備注 |
---|---|---|---|---|
1 | projectcid | uniqueidentifier | 項(xiàng)目ID | |
2 | wxmpcid | uniqueidentifier | 被評價(jià)人ID | |
3 | score | decimal | 被評價(jià)人權(quán)重分1 | 總?cè)藬?shù)的平均分*20% |
4 | score2 | decimal | 被評價(jià)人權(quán)重分2 | 總?cè)藬?shù)的平均分*20%*30% |
5 | dname | nvarchar | 統(tǒng)計(jì)顯示 | 將行數(shù)據(jù)變?yōu)榱袛?shù)據(jù),顯示統(tǒng)計(jì)詳情信息 |
查詢分析器結(jié)果數(shù)據(jù)顯示如下圖:
如圖第一行數(shù)據(jù) dname 列返回 “董事長88.21分,總經(jīng)理100.00分,分協(xié)管領(lǐng)導(dǎo)92.23分,其他領(lǐng)導(dǎo)91.79分,部門職工(2人,總分187.65分)93.83分” ,該列會顯示各職務(wù)打分的人數(shù),總分及平均分情況,從統(tǒng)計(jì)結(jié)果來看,更加直觀。
STUFF函數(shù)實(shí)現(xiàn)
示例代碼如下:
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
關(guān)鍵說明見下表:
序號 | 關(guān)鍵語句 | 說明 |
---|---|---|
1 | round(sum(score2)*0.2,2) score, round(sum(score2)*0.2*0.3,2) score2, | 取權(quán)重值,并使用ROUND函數(shù)取后兩位小數(shù) |
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','')+'分' | 使用 STUFF 函數(shù)配合 SQL 語句 FOR XML PATH 來實(shí)現(xiàn)行轉(zhuǎn)列。 SQL語句中通過 CASE 來判斷人數(shù),大于1則顯示人數(shù)和總分,否則直接顯示分值,并在前面加上職務(wù) lname 字段,并以 count_sortid 進(jìn)行排序,數(shù)值越小的職務(wù)越往前排 |
3 | v_pj_rep1_lname_score a group by projectcid,wxmpcid | 對視圖樣本進(jìn)行項(xiàng)目ID和被評價(jià)人ID進(jìn)行分組統(tǒng)計(jì) |
小結(jié)
SQL Server 中的 STUFF 函數(shù)是將字符串插入到另一個(gè)字符串中。 它從第一個(gè)字符串的開始位置刪除指定長度的字符;然后將第二個(gè)字符串插入到第一個(gè)字符串的開始位置。
至此STUFF的函數(shù)使用我們就介紹到這里,具體使用中我們還需要靈活掌握,對結(jié)果數(shù)據(jù)的細(xì)節(jié)可能要進(jìn)一步進(jìn)行處理,以滿足我們的統(tǒng)計(jì)要求。并可設(shè)計(jì)導(dǎo)出到 WORD或EXCEL文件進(jìn)行下載。
到此這篇關(guān)于MS SQL Server STUFF實(shí)現(xiàn)統(tǒng)計(jì)記錄行轉(zhuǎn)為列顯示的文章就介紹到這了,更多相關(guān)SQL 行轉(zhuǎn)為列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Sql Server 2000刪除數(shù)據(jù)庫備份文件
Sql Server 2000刪除數(shù)據(jù)庫備份文件的語句。2009-09-09SQL有外連接的時(shí)候注意過濾條件位置否則會導(dǎo)致網(wǎng)頁慢
這個(gè)SQL之所以跑得慢是因?yàn)殚_發(fā)人員把SQL的條件寫錯位置了2013-05-05
正確的寫法應(yīng)該是下面這樣的,感興趣的朋友可以參考下SQL中函數(shù) replace 的參數(shù)1的數(shù)據(jù)類型ntext無效的解決方法
SQL中函數(shù) replace 的參數(shù) 1 的數(shù)據(jù)類型 ntext 無效。找了半天找到了解決辦法2010-06-06深入SQL Server中定長char(n)與變長varchar(n)的區(qū)別詳解
本篇文章是對SQL Server中定長char(n)與變長varchar(n)的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06簡單判斷MSSQL數(shù)據(jù)庫版本(2000或者2005)
這篇文章主要介紹了簡單判斷MSSQL數(shù)據(jù)庫版本(2000或者2005),需要的朋友可以參考下2015-01-01SQL?IFNULL()函數(shù)詳細(xì)解析(最新推薦)
IFNULL()?函數(shù)用于判斷第一個(gè)表達(dá)式是否為?NULL,如果為?NULL?則返回第二個(gè)參數(shù)的值,如果不為?NULL?則返回第一個(gè)參數(shù)的值,這篇文章主要介紹了SQL?IFNULL()函數(shù)詳細(xì)解析,需要的朋友可以參考下2023-01-01