`
zhgz0018
  • 浏览: 10075 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

使用函数及游标实现SQL多行转一列

阅读更多

分别使用函数及游标实现SQL多行转一列

有时候在一些系统中我们需要用SQL语句将一对多关系表中的数据以每条记录一行的形式进行显示。本文分别采用函数及游标的方法来实现该功能。

示例表描述如下

一张用户表及文档表

分别使用函数及游标实现SQL多行转一列 - 爱许彩的一切 - 爱  ASP.NET 2.0

现在想实现如下功能,查询出每个用户及其对应的文档名称的综合,如下结果

userID                            userName                               DocNames

1                                    fengyan                            sql基础,asp.net入门

2                                    eflylab                                     精品美食

注意到最后一列是类似统计。这就决定不能使用left join做,那样1号用户会出现二行,不是期望的

其实很多时间需求是需要我们使用SQL完成这样的功能,而不是放在程序里!如果做?

这里可以写一个函数来完成该功能

CREATE function f_getUserDocsByUserID(@userID int) 

returns varchar(8000) 

as 

begin 

declare @str varchar(8000) 

set @str='' 

select @str=@str+','+docName from Doc where UserID=@userID 

if(len(@str)>1)

    set @str=right(@str,len(@str)-1) 

return(@str) 

则相应的查询语句为

select u.*,study.dbo.f_getUserDocsByUserID(u.userID) as docs from [user] as u

运行效果

分别使用函数及游标实现SQL多行转一列 - 爱许彩的一切 - 爱  ASP.NET 2.0

实现功能,这里仅以很简单的示例,演示了将多行转换成一列的需求,实际中针对docs的结果可能更复杂一些。

需要相应的变通!

第二种方式可以使用游标,这对于很多不理解和不会应用游标的朋友来说,可以学习一下!

--定义结果集表变量

DECLARE @t TABLE(userID varchar(10),userName varchar(100),DocNames varchar(8000))

--定义游标并进行合并处理

DECLARE MyCURSOR CURSOR  

FOR

SELECT u.*,d.docName FROM [user] u left join [Doc] d on u.userID=d.userID  order by u.userID

DECLARE @userID_old int,@userID int,@userName varchar(50),@oldUserName varchar(50),@docName varchar(50),@s varchar(100)

--打开游标

OPEN MyCURSOR

FETCH MyCURSOR INTO @userID,@userName,@docName

SELECT @userID_old=@userID,@s='',@oldUserName=@userName

WHILE @@FETCH_STATUS=0    --游标存在数据时循环

BEGIN

    IF @userID=@userID_old    --如果当前记录和上一条用户ID相同,则更改变量@s的值

        SELECT @s=@s+','+@docName

    ELSE

    BEGIN    --否则 已经是下一位用户了,应该执行添加操作

        --UserID改变的时候添加操作

        INSERT @t VALUES(@userID_old,@oldUserName,STUFF(@s,1,1,''))

        --将新的文件名赋值给@s 并且更新@userID_old,@oldUserName

        SELECT @s=','+@docName,@userID_old=@userID,@oldUserName=@userName

    END

    FETCH MyCURSOR INTO @userID,@userName,@docName

END

INSERT @t VALUES(@userID_old,@oldUserName,STUFF(@s,1,1,''))

CLOSE MyCURSOR

DEALLOCATE MyCURSOR

--显示结果

SELECT * FROM @t

运行结果如下:

分别使用函数及游标实现SQL多行转一列 - 爱许彩的一切 - 爱  ASP.NET 2.0

也达到预期,在这里使用了一条left join查询

SELECT u.*,d.docName FROM [user] u left join [Doc] d on u.userID=d.userID  order by u.userID

它的执行结果如下:

分别使用函数及游标实现SQL多行转一列 - 爱许彩的一切 - 爱  ASP.NET 2.0

在方法二中使用游标在这个结果表中循环。中间使用一个变量结果表@t将结果存入@t中,最后@t即为所需结果

 

 

 

 

 

喜欢就来看看.................

分享到:
评论

相关推荐

    游标分类汇总行转列oracleplsql

    行转列(Pivot)是一种将表格中的一列或多列转换为多行的操作,通常用于将一列中的不同值分别转换为表中的单独列。在Oracle中,可以使用 `PIVOT` 函数来实现这一操作。但是,在示例代码中,并没有直接使用 `PIVOT` ...

    函数、游标及DB设计

    3. **表值函数**:返回一个结果集的函数,可以是多行多列的数据。用户定义的表值函数(UDTVF)允许开发者创建自己的表值函数。 4. `function_type1.sql`可能包含了示例函数的定义和使用,比如创建一个自定义函数来...

    使用游标与过程实现排名

    然后,我们在循环中使用`FETCH`语句获取游标中的每一行数据,并通过`RANK()`函数计算每行的排名。最后,关闭游标以释放资源。 接下来,我们讨论过程(Procedure)。过程是PL/SQL中的一个可重用代码块,它可以包含一...

    oracle基础--表、视图、过程、函数、游标、异常

    在PL/SQL中,游标声明、打开、读取、关闭等一系列操作,使得在循环或其他逻辑结构中处理多行数据变得方便。 最后,我们谈一谈“异常”。在编程中,异常是程序运行时出现的问题。Oracle提供了异常处理机制,允许...

    Oracle游标使用方法及语法大全

    显式游标允许在循环中处理多行数据,或者在不将所有数据一次性加载到变量中时使用。声明显式游标的基本语法如下: ```sql DECLARE cursor_name CURSOR FOR select_statement; variable_name column_data_type; ...

    Oracle存储过程实例使用显示游标

    游标是处理单行或多行数据集的一种机制,允许我们遍历结果集并逐行操作。在本例中,“Oracle存储过程实例使用显示游标”着重展示了如何在存储过程中调用函数,并通过游标来处理和更新数据。 首先,我们需要了解存储...

    oracle某个字段多行记录转化为一行

    为了实现将Oracle数据库中某个字段的多行记录合并成一行记录的目标,可以采用编写自定义函数的方法。下面详细介绍该方法的具体步骤: #### 创建函数 `f_m_t` 首先,创建一个名为`f_m_t`的函数,该函数接受一个参数...

    Oracle行转列(不定列)

    然而,在某些场景下,我们可能需要将同一类别的数据从多行转换为一列,以便于比较或分析。Oracle提供了一个名为`PIVOT`的SQL语法,用于实现这种转换。`PIVOT`操作可以将表中的行数据转换为列,使得原本的行数据在...

    pl/sql学习文档

    本篇文章将详细讲解PL/SQL中涉及的存储结构、函数、循环语句以及游标等核心概念。 首先,PL/SQL块允许直接嵌入SQL语句,如SELECT、DML(INSERT, UPDATE, DELETE)和事务控制语句(COMMIT, ROLLBACK, SAVEPOINT)。...

    oracle 行转列

    #### 一、Oracle 行转列概念及应用场景 在数据库操作中,经常需要对数据进行格式上的调整以便更好地分析或展示数据。其中,“行转列”是一种常见的数据处理方式,它指的是将原本存储在多行中的数据转化为单行中的多...

    sqlserver函数大全.pdf

    **游标函数**,如CURSOR_STATUS(),提供关于游标状态的信息,游标在处理多行结果集时特别有用。 **日期和时间函数**,如GETDATE(),返回当前系统日期和时间,还可以进行日期和时间的加减操作,如DATEADD()和...

    利用游标返回结果集的的例子(Oracle 存储过程).doc

    这个函数通过打开一个游标并执行查询(在这里是选择`cf_news`表中的`id`和`title`列,按`id`排序)来实现。执行`open`语句后,函数将返回这个打开的游标。 然后,我们定义了一个名为`getemps`的过程,它接受一个`in...

    分析MSSQL Server里函数的两种用法

    在SQL Server中,函数是数据库管理系统中的重要组成部分,它们用于执行特定的计算或操作,并返回...在设计数据库解决方案时,应当优先考虑是否可以使用函数来替代可能的游标操作,这将有助于实现更佳的性能和可扩展性。

    Oracle PLSQL语言初级教程之游标

    Oracle PL/SQL是一种强大的数据库编程语言,它扩展了SQL的功能,允许开发者编写具有复杂逻辑的存储过程和函数。在PL/SQL中,游标是一种重要的工具,用于处理单行或多行查询结果。本教程主要关注Oracle PL/SQL中的...

    游标分批取数据例子

    下面,我们将深入探讨如何使用Oracle SQL中的游标来分批取数据,并通过一个具体示例来展示这一过程。 ### 游标分批取数据原理 在Oracle SQL中,游标提供了对查询结果集的访问方式,它允许我们逐行或分批读取数据,...

    精通sql结构化查询语句

    以SQL Server为工具,讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中...

    精通SQL--结构化查询语言详解

    17.2 sql游标的使用 351 17.2.1 使用declare cursor语句创建游标 351 17.2.2 使用open/close语句打开/关闭游标 352 17.2.3 使用fetch语句检索数据 352 17.2.4 基于游标的定位delete语句 354 17.2.5 基于游标的...

    mysql中游标的使用案例详解(学习笔记)

    - **特点**:与普通的SELECT语句不同,游标允许用户在存储过程或函数中逐行读取结果集的数据,而不是一次性返回所有结果。 #### 二、游标的基本操作 在MySQL中使用游标涉及到几个关键步骤: **2.1 声明游标** ```...

    sql大全(本人多年积累精华)

    2. **多列的行转列**:在`多列的行转列.sql`中,可能涉及了Pivot操作,这是将表中的行转换为列的技术,常用于数据报表展示,例如将多列的分类数据转换成一列,方便对比分析。 3. **多行补充**:`多行补充.sql`可能...

    Oracle的pl/sql和sqlplus

    SQL*Plus是Oracle提供的一种命令行工具,可以用来编写和执行SQL及PL/SQL语句。 在PL/SQL中,语句块是基本的执行单元,可以包含声明、初始化、控制结构(如IF-THEN-ELSE、WHILE、FOR循环)以及异常处理。在实验中,...

Global site tag (gtag.js) - Google Analytics