首页 | 论坛 | 新闻资讯 | 设计欣赏 | 设计教程 | 网络编程 | 字体下载 | 平面教程 | 特色图标 | 设计素材 | 代码素材 | 网页模板 | 建站服务
卡通 | 环境 | 平面设计 | 网页设计 | 广告艺术 | 时尚摄影 | 形像设计 | 插画设计 | 三维设计 | 工业设计 | 时尚摄影 | 时尚时装 | 界面设计
·企业建站只需980元起
·制作大型专业网站,亦是如此简单
·南宁网站建设  ·南宁网站建设
·南宁网站建设  ·南宁网站建设
 当前位置:主页>网络编程>数据库教程>数据库技巧>列表
SQL Server 中多行多列连接成为单行单列
2008-07-22  来源:网络收集   作者:未知  点击:   评论:0 条

原始结构:


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

*/

[收藏]  [推荐]  [评论]  [打印]  [关闭]
 最新图文
 最新评论
查看所有评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: (新注册) 密码:
匿名?
免责声明:本站刊载此文不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。对本文有异议,请联络本站! 转载要求:文章作者及来源信息必需保留。转载之图片、文件,链接请不要盗链到本站地址,且不准打上各自站点的水印。
 热门关注
 相关文章
 Google提供的广告