SQL Server中多行多列连接成为单行单列
2009-05-12 20:31:27来源:未知 阅读 ()
原始结构:
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
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- SQLServer连接异常的解决方法 2019-12-05
- 剖析SQL Server连接中常见的三个错误 2018-12-02
- 寻回SQL企业管理器里的SQL密码连接方法 2018-12-02
- SQL连接查询介绍 2018-06-17
- 解决MySQL 5数据库连接超时问题 2009-05-12
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash