加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 14:26:24 所属栏目:MsSql教程 来源:网络整理
导读: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 相同的行的 Column

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

  */

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读