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

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

博客园 - 秋雨飘飘

显示日期的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
*/