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,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,E
3 F
*/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。