SQL Server 中多行多列连接成为单行单列
来源:互联网 发布:javascript ajax json 编辑:程序博客网 时间:2024/06/02 05:05
SQL Server 中多行多列连接成为单行单列
原始结构:
Column1 Column2
----------- ----------
1 A
1 B
2 C
2 D
2 E
3 F
----------- ----------
1 A
1 B
2 C
2 D
2 E
3 F
查询效果:
Column1 Column2
----------- ------------------
1 A,B
2 C,D,E
3 F
----------- ------------------
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
*/
-- 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
*/
- SQL Server 中多行多列连接成为单行单列
- SQLServer中多行多列连接成为单行单列
- SQL Server 实现单列累积乘
- sql server 单列并行 for xml path 应用
- 数据由单列或单行编辑成多行多列
- MySQL将多行多列转化为单行单列
- ORACLE 单列查询变单行显示
- 动态创建表格、删除单行、单列
- 如何成为Sql Server DBA
- sql 查单列重复
- SQL 单列转多列
- Java 连接SQL Server 连接
- Perl 连接 SQL Server
- SQL Server 连接基础知识
- 连接SQL Server数据库
- sql server 连接错误
- SQL Server 连接基础知识
- SQL SERVER 连接失败
- 索引碎片统计信息的解释
- 【翻】【官方文章】完整的Flash Object参考
- 在Java中创建字符串
- 我翻译的MASM32参考全本
- 心痛---一个老人被饿死的全程
- SQL Server 中多行多列连接成为单行单列
- 学习Asp.Net应当知道的基本数据库操作语句
- 学习汇编语言程序设计的开始一步~~
- 对字符串的“sum”——在Oracle中自定义聚集函数的例子
- 我生病了,我的小乌龟也生病了
- CMMI 预评估结束了
- 总结网络编程一些要点
- VS2005编译WM5时出现__GSHandlerCheck链接错误
- Oracle常用傻瓜问题1000问