SQLServer中多行多列连接成为单行单列
来源:互联网 发布:java如何设置字符集 编辑:程序博客网 时间:2024/05/18 22:10
http://www.yuloo.com/jsjks/jsj-djks/2008-08-07/105674.html
原始结构:
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
*/
- SQLServer中多行多列连接成为单行单列
- SQL Server 中多行多列连接成为单行单列
- 数据由单列或单行编辑成多行多列
- MySQL将多行多列转化为单行单列
- ORACLE 单列查询变单行显示
- 动态创建表格、删除单行、单列
- 单列
- 单列
- SQLServer单行和多行注释
- 12.在where中使用子查询-子查询返回单行单列和单行多列的数据
- sqlserver连接
- Cassandra 使用Thrift API 操作数据简例--读写单行单列数据
- excel如何把有规律的单行或单列数…
- oracle 连接单列结果集的所有数据。即:单列多行串联
- oracle 连接单列结果集的所有数据(单列多行串联)
- (转)SQLServer基础 单行注释与多行注释
- 连接数据据库单列模式的简单实现
- C#连接sqlserver代码
- 跨站测试与利用中的绕过技术
- 游戏服务器架构探讨
- 用GNU profiler提高代码运行速度
- C++多重继承下的指针类型转换
- C#学习——事件和索引指示器
- SQLServer中多行多列连接成为单行单列
- 优秀有价值的博客收藏列表(持续更新)
- 在Android模拟器上安装已下载的APK软件包
- 几大搜索引擎的网站登录入口
- 用DirectX编写RPG游戏——5.Windows编程基础
- Ubuntu 12.04下搭建Web网站服务器 (MySQL+PHP+Apache环境)
- 声明和定义区别
- MyEclipse自动关闭解决方法及eclipse.ini设置
- Mysql Incorrect string value