文档章节

Sql 列转行 三种方法对比

中东良民
 中东良民
发布于 2017/06/15 14:05
字数 389
阅读 5
收藏 0

SQL code------ 
合并列值  
--******************************************************************************************* 
表结构,数据如下:  
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')  
Go  
--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

 

© 著作权归作者所有

上一篇: C# VPN(转载)
中东良民
粉丝 0
博文 13
码字总数 6586
作品 0
温州
程序员
私信 提问
经典SQL问题: 行转列

学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列。数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键。本文以MySQL为基础,其他数据库会...

闪电
2015/09/19
27.1K
0
DLA SQL技巧:行、列转换和JSON数据列展开

DLA SQL技巧:行、列转换和JSON数据列展开 1. 简介 在数据库SQL处理中,常常有行转列(Pivot)和列转行(Unpivot)的数据处理需求。本文以示例说明在Data Lake Analytics(https://www.aliyu...

julian.zhou
06/19
0
0
做图表统计你需要掌握SQL Server 行转列和列转行

原文:做图表统计你需要掌握SQL Server 行转列和列转行 说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么...

杰克.陈
2017/12/13
0
0
Oracle列转行函数版本不兼容解决方案

业务场景 本博客记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的。不过这个函数使用要谨慎,底层实现应该也是group by等等实现的,性能并不是特别好。...

smileNicky
2018/12/07
0
0
ORACLE 列转行和行转列的SQL和函数

本文介绍两种行、列转换方法,一种是常规的SQL,一种是ORACLE 11G提供的函数。下面使用一个小例子对这两种方法进行说明。 ---------------------------------原始表-----------------------...

moonstarseu
2012/03/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CQRS与AXON

CQRS 看了蛮多文章,只会CRUD,却不懂CQRS,CQRS是遵循DDD思想而产生的一种模式,Command and Query Responsibility Segregation 命令与查询隔离。查询就直接通过正常的模式service调dao层。...

无极之岚
23分钟前
2
0
OSChina 周三乱弹 —— 欢迎你来做产品经理

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :10多次劲歌金曲获奖,更多叱咤歌坛排名,黎明才应该是四大天王之首,只可惜拍的电影太少。单曲循环一个多月的歌,力荐 《无名份的...

小小编辑
38分钟前
60
4
500行代码,教你用python写个微信飞机大战

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!...

上海小胖
今天
8
0
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部