微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLServer中多行多列连接成为单行单列

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] 举报,一经查实,本站将立刻删除。

相关推荐