实现下图类似效果统计
数据库设计如下
存储过程如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | USE [DBTEST] GO /****** Object: StoredProcedure [dbo].[GetData] Script Date : 2023-09-01 16:56:01 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[GetData] as declare @className VARCHAR (50) declare @titleSql varchar (8000) declare @contentSql varchar (8000) declare @allSql varchar (8000) ----------------------------------------------------生成表头---------------------------------------------------- set @titleSql= 'select ' + '' '检查医生' ',' --1.声明游标 DECLARE cursor_devices CURSOR FOR select classname from test group by ClassName --2.打开游标 OPEN cursor_devices; --3.读取游标数据 FETCH NEXT FROM cursor_devices INTO @className; --判断是否执行成功,0 表示成功;-1表示失败 WHILE @@FETCH_STATUS = 0 BEGIN set @titleSql = @titleSql + '' '' + @className + '' ',' --再次读取,否则只读取一次 FETCH NEXT FROM cursor_devices INTO @className; END ; set @titleSql= LEFT (@titleSql,len(@titleSql)-1) print '@titleSql===' +@titleSql; --4.关闭游标 CLOSE cursor_devices; --5.释放游标 DEALLOCATE cursor_devices; ----------------------------------------------------生成表数据---------------------------------------------------- --行转列 --select ---- ROW_NUMBER() over (order by doctorname) as rownumber, -- doctorname, -- sum(case when classname ='CT' then checkcount end) as 'CT', --else 0 可省略 -- sum(case when classname ='MR' then checkcount end) as 'MR', --else 0 可省略 -- sum(case when classname ='DR' then checkcount end) as 'DR' --else 0 可省略 --from test group by doctorname set @contentSql= 'select doctorname as 检查医生, ' --1.声明游标 DECLARE cursor_devices2 CURSOR FOR select classname from test group by ClassName --2.打开游标 OPEN cursor_devices2; --3.读取游标数据 FETCH NEXT FROM cursor_devices2 INTO @className; --判断是否执行成功,0 表示成功;-1表示失败 WHILE @@FETCH_STATUS = 0 BEGIN set @contentSql = @contentSql + 'convert(varchar,sum(case when classname =' + '' '' + @className + '' ' then checkcount end)) as' + '' '' + @className + '' ',' --再次读取,否则只读取一次 FETCH NEXT FROM cursor_devices2 INTO @className; END ; set @contentSql= LEFT (@contentSql,len(@contentSql)-1) + ' from test group by doctorname' print @contentSql; set @allSql=@titleSql + ' union all ' + @contentSql print @contentSql; exec (@allSql); --4.关闭游标 CLOSE cursor_devices2; --5.释放游标 DEALLOCATE cursor_devices2; --exec GetData |
运行效果如下所示:
博客内容主要用于日常学习记录,内容比较随意,如有问题,还需谅解!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本