sqlserver 同字段值拼接 列转行

sqlserver
同字段值拼接(效果同oracle中的wm_concat)


2012-08-13 18:20:46|  分类: sqlserver
|  标签:sqlserver  
|举报 |字号大中小 订阅

合并列值 

--*******************************************************************************************

表结构,数据如下: 
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 [email protected] 
    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
[values]= STUFF(REPLACE(REPLACE( 
         
  ( 
               
SELECT value FROM tb N 
           
    WHERE id = A.id 
         
      FOR XML AUTO 
         
  ), ‘  <N value="‘, ‘,‘), ‘"/>‘, ‘‘), 1, 1, ‘‘) 

)N 
drop table tb 
 
/* 
id   
      values 
----------- ----------- 

        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://topic.csdn.net/u/20090924/11/9a920a29-a6a2-428f-9fab-577058304898.html

自己仿着写了一个例子

select b.SystemName 系统, m.Name 一级菜单,m1.Name 二级菜单,f.Name 
按钮,m1.ID
into #temp
 from  Menu m 
inner  join
Menu m1 on m.ID=m1.ParentID
left  join functions  f on
m1.ID=f.MenuID
inner  join BaseSystem b on
b.SystemFlag=m.SystemFlag 
where b.SystemFlag not 
in(‘EP‘,‘MD‘,‘PC‘) order  by  m.SystemFlag ,m.OrderNo

SELECT B.系统,B.一级菜单, B.二级菜单,StuList 按钮 FROM (
SELECT
二级菜单,系统,一级菜单,
(SELECT 按钮+‘,‘ FROM #temp
  WHERE 二级菜单=A.二级菜单

  FOR XML PATH(‘‘)) AS StuList
FROM #temp A
GROUP BY
系统,一级菜单,二级菜单
) B

时间: 2024-08-01 10:42:32

sqlserver 同字段值拼接 列转行的相关文章

mysql 字段值拼接,同一字段循环拼接

SELECT trp.rest_id as 商户id, trp.rest_name as 商户名称, trp.longitude as 经度, trp.latitude as 纬度, trp.is_premium as 是否品牌, trp.is_new as 是否新店, ters.overall_score as 店铺评价(商品),ters.service_score as 店铺评价(服务态度), tcl.category_name as 所属品类(一级), (SELECT GROUP_CONC

Mysql数据处理/行转列/列转行/分割/拼接/数据复制汇总

mysql数据处理记录(使用的 Workbench) 生成随机数 逗号或分号拼接的字符串分割成多行 多行数据转化成用逗号拼接的字符串 将A表的数据添加到B表 一.生成随机数 生成18位:(19位就加颗0 / 17位就减0) SELECT FLOOR(+ RAND() * 10000000000000000000) 二.将字符串分割(行转列) select a.ID,substring_index(substring_index(a.B,',',b.help_topic_id+1),',',-1)

SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行

来自于 https://www.cnblogs.com/OpenCoder/p/6668882.html 我们在写Sql语句的时候没经常会遇到将查询结果行转列,列转行的需求,拼接sql字符串,然后使用sp_executesql执行sql字符串是比较常规的一种做法.但是这样做实现起来非常复杂,而在SqlServer2005中我们有了PIVOT/UNPIVOT函数可以快速实现行转列和列转行的操作. PIVOT函数,行转列 PIVOT函数的格式如下 PIVOT(<聚合函数>([聚合列值]) FOR

GridView控件RowDataBound事件中获取列字段值的几种途径 !!!

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { e.Row.Attributes.Add("onclick", "javascript:alert('当前ID为:" +DataBinder.Eval(e.Row.DataItem,"CID"

Sqlserver 列转行 行转列

sqlserver的行转列 列转行问题 行转列:1 使用Case when 方式 CREATE TABLE [StudentScores]( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30), --科目 [Score] FLOAT, --成绩) INSERT INTO [StudentScores] SELECT 'Nick', '语文', 80 INSERT INTO [StudentScores] SELECT 'Nick', '数

SQLserver行转列与列转行

行表: 行表 姓名 属性 属性值 JACK 身高 180 JACK 体重 80 JACK 年龄 27 TOM 身高 164 TOM 体重 59 TOM 年龄 20 列表: 列表 姓名 身高 年龄 体重 JACK 180 27 80 TOM 164 20 59 行转列就是将行表转换为列表,反之为列转行. --================================================================== ----------------------------行

SqlServer行转列(PIVOT),列转行(UNPIVOT)总结

PIVOT用于将列值旋转为列名(即行转列) 语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行) 语法: table_source UNPIVOT( value_column FOR pivot_column IN(<column_list>) ) 注意:PIVOT.UNPIVOT是SQL Server 2005的语法,使用需修改数

查询某个分组中多行字段值的拼接字串的方法--access

查询某个分组中多行字段值的拼接字串的方法 先收藏,后面再研究 access的SQL语法中没有自定义函数,也不能象SQL Server中一样用变量.游标.子查询等方法来灵活处理查询语句. 但是,在Access环境中,透过模块中的过程,可利用功能强大的VB语言,生成复杂需求的查询语句. 下面是本人今天在Access版块中的一个回复,以此例 access的SQL语法中没有自定义函数,也不能象SQL Server中一样用变量.游标.子查询等方法来灵活处理查询语句. 但是,在Access环境中,透过模块中

MySQL逗号分割字段的列转行

前言: 由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式.即同一个列中存储了多个属性值(具体结构见下表). 这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列转行的结果. 表数据: ID Value 1 tiny,small,big 2 small,medium 3 tiny,big 期望得到结果: ID Value 1 tiny 1 small 1 big 2 small 2 medium 3 tiny 3 big 总结: 这种方法的缺点在于,我们需要一个拥有连