惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
GbyAI
GbyAI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
U
Unit 42
Engineering at Meta
Engineering at Meta
aimingoo的专栏
aimingoo的专栏
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
Vercel News
Vercel News
美团技术团队
雷峰网
雷峰网
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
D
DataBreaches.Net
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
罗磊的独立博客
MyScale Blog
MyScale Blog
博客园_首页
IT之家
IT之家
F
Fortinet All Blogs
博客园 - Franky

博客园 - 秋雨飘飘

显示日期的javascript日历 Iframe的基础应用——关于Iframe刷页问题的两种方法 关于left join的讨论 往表中允许为null的字段插入null值 - 秋雨飘飘 - 博客园 sql查询最大最小值 SQL Server CHARINDEX和PATINDEX详解 sql行列转换 sql语句优化的一些测试函数 存储过程的作用是自动生成编号 数据库管理常用SQL T-SQL 编程规范和优化技巧 (转)SQL Server 索引结构及其使用 动态查询SQL中变量的返回值 存储过程的编写经验 求薪水第三高的雇员的SQL题(图解) 表连接的比较left join/right join/inner join sql 视图 sql 日期函数之对于周的处理 如何提升checkbox的用户体验
SQL Server 中多行多列连接成为单行单列
秋雨飘飘 · 2007-07-19 · via 博客园 - 秋雨飘飘

原始结构

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现简单实现一个DEMO,以便参考。

-- 多行多列连接成为单行单列示例:需要一个自定义函数

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
*/