利用游标进行列转行实例详解

游标的定义、语法啥的请诸君搜索百度,本博文是一个详细的实例讲解,写的不一定最好,抛砖引玉而已。

假如有一张表#DETAIL:

CREATE TABLE #DETAIL 

(

ID INT NOT NULL IDENTITY(1, 1),

类型INT NOT NULL DEFAULT(0), 

楼宇NVARCHAR(50) NOT NULL DEFAULT(''), 

单元IDINT NOT NULL DEFAULT(0), 

客户编号NVARCHAR(50) NOT NULL DEFAULT(''), 

客户名称NVARCHAR(50) NOT NULL DEFAULT(''), 

应收期间NVARCHAR(50) NOT NULL DEFAULT(''),

费用IDINT NOT NULL DEFAULT(0), 

费用名称NVARCHAR(50) NOT NULL DEFAULT(''),

金额MONEY NOT NULL DEFAULT(0),  

备注NVARCHAR(200) NOT NULL DEFAULT('')

)

----现在临时表#DETAIL中已经有了数据,数据格式大概是这样的:

------------------------------------------------------

id 客户编号  客户名称 …… 费用ID 费用名称 ……      金额

-----------------------------------------

1    A-001     A           1       租金              100

2    A-001     A           2       物业管理费        300

3    A-002     B           3       押金              300

4    A-003     C           4       水费              400

……

现在要将费用名称这一列转成属性字段,即:

--------------------------------------------------------

id 客户编号  客户名称 租金  物业管理费 押金  水费 ……(以此类推)

------------------------------------------------

1    A-001     A       100     300      0    0  

2    A-002     B        0       0     300    0

3    A-003     C        0       0       0    400

…………

游标可以理解为缓存,我要将费用名称列转行,那就将这些费用名称放到缓存中,

然后逐一拿出来,进行增加列操作就可以了。

-----------定义游标中使用到的参数

DECLARE @nvcSQL NVARCHAR(4000)----定义动态执行语句

DECLARE @iFeeID INT    -----费用ID

DECLARE @nvcFeeName NVARCHAR(200) ----费用名称

DECLARE @nvcFieldName NVARCHAR(200)-----列名

-------游标实现:将#DETAIL 进行列转行,费用名称作为列标题

DECLARE CURSOR_FYXM CURSOR  ------定义游标,

FOR

-----将#DETAIL中的费用id和费用名称两列中的数据去重写入游标(可以理解为写入缓存)

SELECT DISTINCT 费用ID,费用名称

FROM  #DETAIL

WHERE 费用ID>0 AND 类型=1 ORDER BY 费用ID

------此时可以这么理解,就是有一张表(缓存),存储了我上边的这条SELECT出来的数据,如下形态:

--------------------------------

号码   费用id  费用名称

----------------------

1         1      租金

2         2      物业管理费

3         3      押金

4         4      水费

……

FOR READ ONLY    -----只读打开

OPEN CURSOR_FYXM   ----打开这个游标,获取缓存中的数据

FETCH NEXT FROM CURSOR_FYXM  ----利用FETCH进行(循环)取数,先将第一条费用id和费用名称依次取出来(其实就是指针的移动)

INTO  @iFeeID,@nvcFeeName    ----将取出来的值,赋给前边定义的两个变量

--------------赋值之后,进行动态SQL语句的拼接

WHILE @@FETCH_STATUS = 0  ----游标读取下一条数据是否成功,成功表示取到数据啦,可以用啦

BEGIN

SET @nvcFieldName = QUOTENAME(LTRIM(RTRIM(@nvcFeeName))) ----去除左右括号,并强制为属性字段(QUOTENAME不懂得可以去查查)

-----组合SQL开始

①SET @nvcSQL = 'ALTER TABLE #total ADD ' + @nvcFieldName + ' MONEY NULL '

②EXEC (@nvcSQL)

-----上边这①和②组合的意思就是直接执行此语句:“ALTER TABEL #total ADD [租金] MONEY NULL”

-----这里的 “租金” 就是第一次从缓存中取出来赋值给 @nvcFeeName 的数据。

----- @iFeeID 变量没有用,其实是对游标的浪费。游标是很耗资源的。

-----当执行到下一循环的时候,本SQL语句就变成了“ALTER TABEL #total ADD [物业管理费] MONEY NULL”

-----新增字段之后,进行字段值更新

③SET @nvcSQL = 'UPDATE #total SET ' + @nvcFieldName + ' = #DETAIL.金额,实收=ISNULL(实收,0)+#DETAIL.金额

FROM #DETAIL

WHERE #DETAIL.类型=1 AND #total.单元ID = #DETAIL.单元ID AND #DETAIL.费用名称 = ''' + @nvcFeeName + ''''

④EXEC (@nvcSQL)

-----③和④就是执行更新,将#DETAIL中的数据更新到#total,善后工作

FETCH NEXT FROM CURSOR_FYXM    ----用完了,丢掉,取出下一条数据,即 费用id为2,费用名称为“物业管理费”

INTO @iFeeID, @nvcFeeName

END

------WHILE ??? BEGIN …… END ,常用的循环。

CLOSE CURSOR_FYXM    ----取完最后一条数据后,关闭游标,释放缓存

DEALLOCATE CURSOR_FYXM

转载于:https://www.cnblogs.com/sanlu/p/6150130.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值