SQL Server中多行多列连接成为单行单列

作者:Andy 时间:2008-12-09 14:39:00 

原始结构:

Column1 Column2

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

1 A

1 B

2 C

2 D

2 E

3 F

查询效果:

Column1 Column2

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

1 A,B

2 C,D,E

3 F

即将 Column1 相同的行的 Column2 连成一列。

不知如何描述此种用法,是否具有像交叉表相关的 Cross-Table 和 Pivot 之类的约定成熟的专业称谓?

是否也可以称为另一种 Cross-Table ?

此需求应该是常见的,网上也有许多DEMO,只是 CSDN 中频繁有新手提问,现简单实现一个DEMO,以便参考。

-- 多行多列连接成为单行单列示例:需要一个自定义函数

-- http://community.csdn.net/Expert/TopicView3.asp?id=5603231

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VertToHorzSample]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[VertToHorzSample]

GO

-- 建立测试数据

CREATE TABLE VertToHorzSample(

Column1 int,

Column2 varchar(100)

)


GO


INSERT INTO VertToHorzSample(Column1, Column2)

SELECT 1, 'A'

UNION ALL

SELECT 1, 'B'

UNION ALL

SELECT 2, 'C'

UNION ALL

SELECT 2, 'D'

UNION ALL

SELECT 2, 'E'

UNION ALL

SELECT 3, 'F'

GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ConvertVertToHorz]') and xtype in (N'FN', N'IF', N'TF'))

drop function [dbo].[ConvertVertToHorz]

GO

-- 建立辅助函数

CREATE FUNCTION ConvertVertToHorz(@Col1Val int)

RETURNS VARCHAR(8000)

AS

BEGIN

-- 实际项目中,应该考虑 @RetVal 是否会超过 8000 个字符

DECLARE @RetVal varchar(8000)

SET @RetVal = ''

-- 通过递归 SELECT 连接指定列存储到临时变量中

SELECT @RetVal = Column2 + ',' + @RetVal FROM VertToHorzSample WHERE Column1 = @Col1Val

-- 连接多列

-- SELECT @RetVal = Column2 + ',' + Column3 + ',' + Column4 + ',' + @RetVal FROM VertToHorzSample WHERE Column1 = @Col1Val

-- 去掉尾巴的 , (逗号)

IF LEN(@RetVal) > 0

SET @RetVal = LEFT(@RetVal, LEN(@RetVal) - 1)

--PRINT @RetVal


RETURN @RetVal

END

GO

-- 测试

SELECT Column1, dbo.ConvertVertToHorz(Column1) Column2 FROM (SELECT DISTINCT Column1 FROM VertToHorzSample) t

/**//*

Column1 Column2

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

1 A,B

2 C,D,E

3 F

*/


GO


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[VertToHorzView]') and OBJECTPROPERTY(id, N'IsView') = 1)

drop view [dbo].[VertToHorzView]

GO


-- 可以建立一个视图

CREATE VIEW dbo.VertToHorzView

AS

SELECT Column1, dbo.ConvertVertToHorz(Column1) Column2

FROM (SELECT DISTINCT Column1 FROM dbo.VertToHorzSample) t

GO

-- 测试视图

SELECT * FROM VertToHorzView

/**//*

Column1 Column2s

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

1 A,B

2 C,D,E

3 F

*/

标签:
0
投稿

猜你喜欢

  • Python字符串str和json格式相互转换

    2023-01-21 03:26:25
  • Django自定义模板过滤器和标签的实现方法

    2023-08-12 12:24:51
  • JavaScript实现淘宝网图片的局部放大功能

    2023-08-25 05:44:56
  • JavaScript 基础问答 四

    2024-04-18 10:52:09
  • python在新的图片窗口显示图片(图像)的方法

    2021-11-17 00:38:18
  • 用js+cookie记录滚动条位置

    2024-06-05 09:11:02
  • python爬虫开发之PyQuery模块详细使用方法与实例全解

    2021-05-28 20:54:29
  • Python制作个性化的词云图实例讲解

    2021-10-17 03:51:02
  • SQL Server简单实现数据的日报和月报功能

    2024-01-18 15:19:17
  • Django debug为True时,css加载失败的解决方案

    2022-05-07 01:17:53
  • MySQL表操作插入数据insert语句学习(小白入门篇)

    2024-01-14 23:37:49
  • PHP的SQL注入过程分析

    2023-11-18 02:53:27
  • Python使用OpenCV对图像进行缩放功能

    2022-05-06 03:47:51
  • OpenCV-Python实现通用形态学函数

    2022-02-13 18:10:33
  • 教你用一行Python代码实现并行任务(附代码)

    2021-06-23 03:21:24
  • JS中from 表单序列化提交的代码

    2023-09-09 22:54:01
  • 机器深度学习二分类电影的情感问题

    2022-07-17 06:13:28
  • Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码

    2024-05-09 09:38:16
  • Django--权限Permissions的例子

    2021-02-16 01:44:51
  • Docker部署用Python编写的Web应用的实践

    2022-05-11 17:53:28
  • asp之家 网络编程 m.aspxhome.com