博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql 列转行 三种方法对比
阅读量:6705 次
发布时间:2019-06-25

本文共 2013 字,大约阅读时间需要 6 分钟。

 

合并列值  

--******************************************************************************************* 
表结构,数据如下:  
id    value  
----- ------  
1    aa  
1    bb  
2    aaa  
2    bbb  
2    ccc  
  
需要得到结果:  
id    values  
------ -----------  
1      aa,bb  
2      aaa,bbb,ccc  
即:group by id, 求 value 的和(字符串相加)  
  
1. 旧的解决方法(在sql server 2000中只能用函数解决。)  
--============================================================================= 
create table tb(id int, value varchar(10))  
insert into tb values(1, 'aa')  
insert into tb values(1, 'bb')  
insert into tb values(2, 'aaa')  
insert into tb values(2, 'bbb')  
insert into tb values(2, 'ccc')  
  
--1. 创建处理函数  
CREATE FUNCTION dbo.f_strUnite(@id int)  
RETURNS varchar(8000)  
AS  
BEGIN  
     DECLARE @str varchar(8000)  
     SET @str = ''  
     SELECT @str = @str + ',' + value FROM tb WHERE id=@id  
     RETURN STUFF(@str, 1, 1, '')  
END  
GO  
-- 调用函数  
SELECt id, value = dbo.f_strUnite(id) FROM tb GROUP BY id  
drop table tb  
drop function dbo.f_strUnite  
go 
/*  
id          value       
----------- -----------  
1          aa,bb  
2          aaa,bbb,ccc  
(所影响的行数为 2 行)  
*/  
--=================================================================================== 
2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)  
create table tb(id int, value varchar(10))  
insert into tb values(1, 'aa')  
insert into tb values(1, 'bb')  
insert into tb values(2, 'aaa')  
insert into tb values(2, 'bbb')  
insert into tb values(2, 'ccc')  
go  
-- 查询处理  
SELECT * FROM(SELECT DISTINCT id FROM tb ) A OUTER APPLY (
         SELECT value= STUFF(
             REPLACE((  
                 SELECT value FROM tb N  
                 WHERE N.id = A.id  
                 FOR XML AUTO  
             ),' ',''), 1, 1, '')  ) AS P

drop table tb  

  
/*  
id          values  
----------- -----------  
1          aa,bb  
2          aaa,bbb,ccc  
  
(2 行受影响)  
*/  
  
--SQL2005中的方法2  
create table tb(id int, value varchar(10))  
insert into tb values(1, 'aa')  
insert into tb values(1, 'bb')  
insert into tb values(2, 'aaa')  
insert into tb values(2, 'bbb')  
insert into tb values(2, 'ccc')  
go  
  
select id, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '')  
from tb  
group by id  
  
/*  
id          values  
----------- --------------------  
1          aa,bb  
2          aaa,bbb,ccc  
  
(2 row(s) affected)  
  
*/  
  
drop table tb

 

转载地址:http://riflo.baihongyu.com/

你可能感兴趣的文章
解决Installation error: INSTALL_FAILED_VERSION_DOWNGRADE错误
查看>>
os 计算机的启动
查看>>
C++Vector使用方法
查看>>
字符串逆序输出
查看>>
[LeetCode] Length of Last Word 求末尾单词的长度
查看>>
[PHP100]留言板(一)
查看>>
boost::asio实现一个echo服务器
查看>>
标准差(standard deviation)和标准误差(standard error)你能解释清楚吗?
查看>>
Javascript 学习 笔记一
查看>>
写给自己看的小设计3 - 对象设计通用原则之核心原则
查看>>
postgresql 修改字段名称
查看>>
atitit.为什么 java开发要比php开发速度慢??
查看>>
BZOJ 1396&&2865 识别子串[后缀自动机 线段树]
查看>>
Kubernetes如何支持有状态服务的部署?
查看>>
vue学习笔记1-基本知识
查看>>
text-align 属性,输入框数字向右靠
查看>>
java-信息安全(十四)-初探SSL
查看>>
ElasticSearch 应用场景
查看>>
微信小程序,创业新选择
查看>>
FastJson和Gson和Json数据解析分析和用法
查看>>