数据库中列变成行
来源:互联网 发布:环信 java 服务端 编辑:程序博客网 时间:2024/05/17 06:47
ORACLE中
手术医师 助手医师 洗手护士 巡回护士 麻醉医师 OPERATIONNO
吴一琼 2013041109132437刘佳 2013041109132437
龚巍 2013041109132437
2013041109132437
李华# 2013041109132437
仇正平 2013041109132437
SELECT wmsys.wm_concat (case when duty='001' then trim(empl_name) END) as 手术医师, wmsys.wm_concat (case when duty='003' then trim(empl_name) END) as 助手医师, wmsys.wm_concat (case when duty='012' then trim(empl_name) END) as 洗手护士, wmsys.wm_concat (case when duty='013' then trim(empl_name) END) as 巡回护士, wmsys.wm_concat(case when duty='101' then trim(empl_name) END) as 麻醉医师, his.OP_PERSONARR.operationno FROM his.OP_PERSONARR WHERE operationno='2013041109132437' GROUP BY operationno
SERVER 中
方法一:
if not object_id('Tab') is null drop table Tab Go Create table Tab([Col1] int,[Col2] nvarchar(1)) Insert Tab select 1,N'a' union all select 1,N'b' union all select 1,N'c' union all select 2,N'd' union all select 2,N'e' union all select 3,N'f' Go 合并表: SQL2000用函数: go if object_id('F_Str') is not null drop function F_Str go create function F_Str(@Col1 int) returns nvarchar(100) as begin declare @S nvarchar(100) select @S=isnull(@S+',','')+Col2 from Tab where Col1=@Col1 return @S end go Select distinct Col1,Col2=dbo.F_Str(Col1) from Tab go SQL2005用XML: 方法1: select a.Col1,Col2=stuff(b.Col2.value('/R[1]','nvarchar(max)'),1,1,'') from (select distinct COl1 from Tab) a Cross apply (select COl2=(select N','+Col2 from Tab where Col1=a.COl1 For XML PATH(''), ROOT('R'), TYPE))b 方法2: select a.Col1,COl2=replace(b.Col2.value('/Tab[1]','nvarchar(max)'),char(44)+char(32),char(44)) from (select distinct COl1 from Tab) a cross apply (select Col2=(select COl2 from Tab where COl1=a.COl1 FOR XML AUTO, TYPE) .query(' <Tab> {for $i in /Tab[position() <last()]/@COl2 return concat(string($i),",")} {concat("",string(/Tab[last()]/@COl2))} </Tab>') )b SQL05用CTE: ;with roy as(select Col1,Col2,row=row_number()over(partition by COl1 order by COl1) from Tab) ,Roy2 as (select COl1,cast(COl2 as nvarchar(100))COl2,row from Roy where row=1 union all select a.Col1,cast(b.COl2+','+a.COl2 as nvarchar(100)),a.row from Roy a join Roy2 b on a.COl1=b.COl1 and a.row=b.row+1) select Col1,Col2 from Roy2 a where row=(select max(row) from roy where Col1=a.COl1) order by Col1 option (MAXRECURSION 0) 生成结果: /* Col1 COl2 ----------- ------------ 1 a,b,c 2 d,e 3 f (3 行受影响) */
方法二:
合并列值 --*******************************************************************************************表结构,数据如下: 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 [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 ----------- ----------- 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
- 数据库中列变成行
- 成行碌栽伤普睦毕下棺课枚俳屠逞
- 在数据库中如何让列变成行,让行变成列的问题
- 把列排成行
- 字符串拆分成行
- Oracle将列转换成行
- 注定不能成行的DEV2DEV之旅
- 把列变成行的sql语句
- ms sql 将列转换成行
- 将一个XML文本显示成行
- 将一个XML文本显示成行
- 将一个XML文本显示成行
- 志愿之路因爱成行
- sql 把列变成行显示
- XCode 4 左花括号独立成行
- XCode 4.3 左花括号独立成行
- oracle列变成行逗号分隔
- hive lateral view语句:列拆分成行
- C++函数指针、函数指针数组
- c++ 多线程阻塞队列的简单实现
- Boost下载安装编译配置使用指南(含Windows和Linux)
- 保留几位有效数字 多种方法实现及注意事项
- 前辈的问
- 数据库中列变成行
- mysql数据库排名
- java4android视频教程学习笔记(第1-17集)
- GDI+ 没有GDI中坐标映射的概念
- JS
- 【leetcode】Surrounded Regions
- 由C/C++中的结构体包含数组引申到C/C++堆栈
- Intel-最快线程间数据交换算法,有效避免锁竞争 -- TwoQueues
- Vim高级进阶之ex命令集