首页 > 其他分享 >018 学习笔记-- 实现二维表头统计(存储过程+游标+行转列+字符串截取)

018 学习笔记-- 实现二维表头统计(存储过程+游标+行转列+字符串截取)

时间:2023-09-01 18:34:03浏览次数:38  
标签:className -- 游标 titleSql cursor 转列 表头 contentSql

实现下图类似效果统计

 数据库设计如下

 

 存储过程如下所示:

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

运行效果如下所示:

 

标签:className,--,游标,titleSql,cursor,转列,表头,contentSql
From: https://www.cnblogs.com/YYkun/p/17672657.html

相关文章

  • oracle-行转列
    现有由多个诊断组成的字段,诊断个数不定,由英文逗号拼接。现需要将字段分解,每条诊断列为一行。转化前字段如下图:转化后字段如下图:SQL实现方法如下:selecta.id,substr(编码,instr(编码,',',1,levels.lvl)+1,instr(编码,',',1,levels.lvl+1)-(instr(编码,',',1,levels.lvl)+1)......
  • SQL Server游标
    文章来源:SQLServer游标-张龙豪-博客园(cnblogs.com) --5.利用游标更新删除数据---游标更新删除当前数据---1.声明游标declareorderNum_03_cursorcursorscrollforselectOrderId,userIdfrombigorderwhereorderNum='ZEORD003402'--2.打开游标openorder......
  • MysSQL 行转列以及列转行(学生的各科成绩,以及总分和平均分)
    一、行转列即将原本同一列下多行的不同内容作为多个字段,输出对应内容。1.建表语句--新建学生成绩表DROPTABLEIFEXISTStb_score;createtabletb_score(idint(11)notnullauto_increment,user_noVARCHAR(32)notnullcomment'学生工号',subject......
  • Sql Server -游标2
    1.创建一个单字段游标stfidgodeclarecs_stfidscrollcursorforselectstfidfromstaff --scroll定义滚动游标2.打开游标open cs_stfid3.提取游标第一行数据fetchfirstfromcs_stfid4.获取游标数据集行数select@@currsor_rows 5.获取提取状态select@@fetch......
  • 记录一个解决方法- 使用editableProTable表头筛选,无法重置,位置偏移
    问题如图:切换原始告警和收敛告警以后,由于二者用到同一个table,切换之后再点击筛选条件,则筛选框的位置发生偏移解决办法:给table一个key属性,改变table中的数据或者列时,去改变这个唯一的key,key值改变,table就可以重新渲染了!......
  • elementUi table表格 标头自定义,给表头加点击事件
    <el-table-columnlabel="">  <el-table-columnprop="column":render-header="renderHeader"width="160">    <templateslot-scope="scope">      <span>{{scope.row.column[......
  • sql service行转列
    PIVOT的一般语法:SELECT[新表字段1,2,3…]FROM[原表名]AS[原表别名]PIVOT([聚合函数]([原表字段1])FOR[原表字段2]IN([原表2值1],[原表字段2值2]…))AS[新表别名]语法解释:1、PIVOT必须列举[原表字段2的值],列举的值必须用中括号[]包含起来,就算是字符串类型也不需......
  • openGauss学习笔记-38 openGauss 高级数据管理-游标
    openGauss学习笔记-38openGauss高级数据管理-游标为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游标,存储过程可以控制上下文区域的变化。38.1语法格式定义游标CURSORcursor_name[BINARY][NOSCROLL]......
  • el-table表头高亮动画效果
    el-table表头高亮动画效果<divclass="front-table"><el-table:data="tableData"height="100%"stripe:header-cell-style="{backgroundC......
  • 游标与解析(硬、软、软软)
    Cursor直译过来就是“游标”,它是Oracle数据库中SQL解析和执行的载体。Oracle数据库使用C语言写的,所以从本质上来说,可以将Cursor理解成C语言中的一种结构。Oracle数据库中Cursor分为两种类型:一种是SharedCursor;另一种是SesssionCursor一、sharedcursorOracle数据库中的SharedCur......