




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多行合并为一行的SQL语句目录例一1例二2例三3例四5例五6例六 如何将多行数据合并成一行多列7例七 C#12 例一表数据:testno q-1 n11 n21 n31 n41 n53 t13 t23 t33 t43 t53 t62 m1语句:with test as ( SELECT 1 AS No, N1 AS q FROM Dual UNION ALLSELECT 1 AS No, N2 AS q FROM Dual UNION ALLSELECT 1 AS No, N3 AS q FROM Dual UNION ALLSELECT 1 AS No, N4 AS q FROM Dual UNION ALLSELECT 1 AS No, N5 AS q FROM Dual UNION ALLSELECT 3 AS No, T1 AS q FROM Dual UNION ALLSELECT 3 AS No, T2 AS q FROM Dual UNION ALLSELECT 3 AS No, T3 AS q FROM Dual UNION ALLSELECT 3 AS No, T4 AS q FROM Dual UNION ALLSELECT 3 AS No, T5 AS q FROM Dual UNION ALLSELECT 3 AS No, T6 AS q FROM Dual UNION ALLSELECT 2 AS No, M1 AS q FROM Dual) SELECT No, Substr(Jg, 2, Length(Jg) AS Jg FROM (SELECT No, MAX(Sys_Connect_By_Path(q, ,) AS Jg FROM (SELECT No, q, Row_Number() Over(PARTITION BY No ORDER BY No, q) Rn FROM Test) START WITH Rn = 1 CONNECT BY Rn - 1 = PRIOR Rn AND No = No GROUP BY No)谭工前面那个示例CONNECT BY Rn - 1 = PRIOR Rn AND No = No也应改成CONNECT BY No|(Rn - 1) = PRIOR (NO|Rn)结果才对。另外这个SQL只适合在小数据集或索引结果中进行处理,不然要使用全表扫描效率不高。输出:1,N1,N2,N3,N4,N52,M13,T1,T2,T3,T4,T5,T6 例二另解:人员所属部门:第一个部门为缺省部门SELECT 人员编号, MIN(姓名) AS 姓名, Substr(MAX(To_Char(Length(部门), 99999999) | 部门), 11, 2000) AS 部门 FROM (SELECT 人员编号, 姓名, Sys_Connect_By_Path(部门, ,) AS 部门 FROM (SELECT 姓名, 部门, 缺省, 人员编号, Row_Number() Over(PARTITION BY 姓名 ORDER BY 人员编号, 缺省 DESC) Rn FROM (SELECT c.姓名, b.名称 AS 部门, a.缺省, c.编号 AS 人员编号, b.编码 AS 部门编码 FROM 部门人员 a, 部门表 b, 人员表 c WHERE a.部门id = b.Id AND a.人员id = c.Id ) t) START WITH Rn = 1 CONNECT BY (人员编号 | (Rn - 1) = PRIOR (人员编号 | Rn)GROUP BY 人员编号ORDER BY 部门CONNECT BY (人员编号 | (Rn - 1) = PRIOR (人员编号 | Rn)这一句整很久才整出来,为了避免不等长的编号,下面的改进也许更合适:CONNECT BY (人员编号 | | | (Rn - 1) = PRIOR (人员编号 | | | Rn)这样就不会出现错乱了. 例三如何将一个表中的多行数据合并为一行新数据?比如有表A IDField1 Field2 Field3 1 b 10.1 12.2 2 b 9.8 8.6 3 c 12.3 11.2 4 c 5.3 8.2 现在想生成下面这样的数据 IDField1 Field2 Field3 1 b 10.1 12.2 2 b 9.8 8.6 3 c 12.3 11.2 4 c 5.3 8.2 5b_all 19.9 20.8 注:19.9=10.1+9.820.8=12.2+8.6 6 c_all 17.6 19.4 请问如何用SQL语句或存贮过程来实现?Try: Select * from 表A Union all Select 5,b_all,sum(field2),sum(field3) from 表A where field1 = b group by 5,b_all Union all Select 6,b_all,sum(field2),sum(field3) from 表A where field1 = c group by 5,b_all Select * from 表A Union all Select (select max(id) from 表A)+1 ,b_all ,sum(field2),sum(field3) from 表A where field1 = b Union all Select (select max(id) from 表A)+2,c_all,sum(field2),sum(field3) from 表A where field1 = c select IDENTITY(INT,1,1) ID,T.* into #temp FROM (select Field1,Field2,Field3 from 表A Union all select Field1+_all,sum(Field2),sum(Field3) from 表A group by Field1) T select * from #temp drop table #temp测试: create table 表A (id int,field1 char(1),field2 numeric(10,1),field3 numeric(10,1) insert 表A select 1 ,b, 10.1, 12.2 union all select 2 ,b, 9.8, 8.6 union all select 3 ,c, 12.3, 11.2 union all select 4 ,c, 5.3, 8.2 Select * from 表A Union all Select (select max(id) from 表A)+1 ,b_all ,sum(field2),sum(field3) from 表A where field1 = b Union all Select (select max(id) from 表A)+2,c_all,sum(field2),sum(field3) from 表A where field1 = c id field1 field2 field3 - - - - 1 b 10.1 12.2 2 b 9.8 8.6 3 c 12.3 11.2 4 c 5.3 8.2 5 b_all 19.9 20.8 6 c_all 17.6 19.4 (所影响的行数为 6 行) 例四如何把查询到的多行数据合并为一行?楼主Chice_wxg(学)(习)2004-11-07 13:27:22 在 MS-SQL Server / 基础类 提问 我需要类似以下功能: update table1 set data=(select line from table2) 但是select如果返回多行显然无法直接进行这种操作, 请问如何解决?谢谢 data 和 line都是字符传。 比如: table2中有很多记录(line) id line 1 asdf 2 zxcv 3 lkjha 我希望最终例如: update table1 where id=指定记录 set data=( .不知道怎么写.) 最终: table1中那条记录的data 字段的内容是类似asdf zxcv lkjha的形式。 也就是说要把table2 中的所有内容放到一个字符串中。-这样的更新无法用一个语句实现 -你可以这样处理 declare s varchar(8000) set s= select s=s+ +line from table2 update table1 set data=stuff(s,1,1,) where id=指定记录Top5 楼zjcxc(邹建)回复于 2004-11-07 13:48:32 得分 30-或者写个自定义函数 create function f_str()returns varchar(8000) as begin declare s varchar(8000) set s= select s=s+ +line from table2 return(stuff(s,1,1,) end go -调用函数实现更新 update table1 set data=dbo.f_str() where id=指定记录 例五如何将多行记录合并为一行?网友提问于2007年3月20日 有两张表A和B,A中一条记录对应B中多条记录,我想在查询结果中把B中多行的记录添加在A后面,比如: 原结构 A.ID1, B.VALUE11 A.ID1, B.VALUE12 A.ID1, B.VALUE13 A.ID2, B.VALUE21 A.ID2, B.VALUE22 改变后的结构 A.ID1, B.VALUE11, B.VALUE12, B.VALUE13 A.ID2, B.VALUE21, B.VALUE22, null -楼主在论坛里搜搜,很多的 create table tb(ID varchar(10),NAME varchar(10) insert into tb select A.ID1, B.VALUE11 union all select A.ID1, B.VALUE12 union all select A.ID1, B.VALUE13 union all select A.ID2, B.VALUE21 union all select A.ID2, B.VALUE22 go create function dbo.fc_str(id varchar(100) returns varchar(100) as begin declare sql varchar(1000) set sql= select sql=sql+,+cast(name as varchar(100) from tb where id=id return stuff(sql,1,1,) end go select id,dbo.fc_str(id) as name from tb group by id drop table tb drop function dbo.fc_str 例六 如何将多行数据合并成一行多列楼主lamb218()2005-08-29 11:55:28 在 MS-SQL Server / 应用实例 提问数据: 编码 用户数 01 100 02 120 03 160 04 320 合并后的效果应如下: 100 120 160 320 问题点数:40、回复次数:16Top 1 楼wgsasd311(自强不息)回复于 2005-08-29 12:26:50 得分 15declare sql varchar(4000) set sql= select sql=sql+,+ 编码+=sum(case 编码 when + 编码+ then 用户数 else 0 end) from tbl set sql=select +right(sql,len(sql)-1)+ from tbl exec(sql)Top2 楼jinjazz(近身剪)回复于 2005-08-29 12:30:18 得分 15-建立测试环境 Create Table 表(编码 varchar(10),用户数 varchar(10) -插入数据 insert into 表 select 01,100 union select 02,120 union select 03,160 union select 04,320 declare str varchar(8000) -测试语句 set str= select str=str+用户数+ from 表 print str /*-输出 100 120 160 320 -*/ -删除测试环境 Drop Table 表 Top3 楼xueguang(xg)回复于 2005-08-29 12:30:27 得分 0 declare a varchar(4000) set a= select a=a+ +用户数 from 表 select stuff(a,1,1,)Top4 楼lamb218()回复于 2005-08-29 13:04:59 得分 0 你们实现的都是合并后一行一列,我要求把分成多列! 能实现吗?Top5 楼wgsasd311(自强不息)回复于 2005-08-29 13:21:21 得分 0 楼主,你有没有看懂我代码,他实现的是一行多列,列数由编码个数动态确定。Top6 楼jinjazz(近身剪)回复于 2005-08-29 13:23:19 得分 0 那你group byTop7 楼xueguang(xg)回复于 2005-08-29 13:23:40 得分 10-分成多列一楼的就可以,如果编码有重复,可以这样写 declare sql varchar(4000) set sql= select sql=sql+,+ 编码+=sum(case 编码 when + 编码+ then 用户数 else 0 end) from (select distinct 编码 from 表) A set sql=select +right(sql,len(sql)-1)+ from 表 exec(sql) Top8 楼jinjazz(近身剪)回复于 2005-08-29 13:25:13 得分 0 -建立测试环境 Create Table 表(id varchar(10),amount integer,remark varchar(10) -插入数据 insert into 表 select 1,3,aaa union select 1,5,bbb union select 1,4,ccc union select 2,10,pkoge union select 2,12,daf go -测试语句 CREATE FUNCTION FunMergeCharField(vchA varchar(10) RETURNS varchar(8000) AS BEGIN DECLARE r varchar(8000) SET r= SELECT r=r+,+remark FROM 表 WHERE id=vchA RETURN(substring(r,2,8000) END GO select id,sum(amount) as sum,dbo.FunMergeCharField(id) as remark叠加 from 表 group by id -删除测试环境 Drop Table 表 Drop FUNCTION FunMergeCharFieldTop9 楼wgsasd311(自强不息)回复于 2005-08-29 13:41:57 得分 0 jinjazz(近身剪(充电中.)) -thanks . 改正如下: declare sql varchar(4000) set sql= select sql=sql+,+ 编码+=sum(case 编码 when + 编码+ then 用户数 else 0 end) from tbl set sql=select +right(sql,len(sql)-1)+ from tbl group by exec(sql) Top10 楼lamb218()回复于 2005-08-29 13:45:53 得分 0 我重新发一遍吧,估计我说的不够清楚。谢谢了! 1长春 1.标准全球通 234 1长春 2.全球通资费套餐 5423 1长春 3.全球通优惠 454 2吉林 1.标准全球通 297 2吉林 2.全球通资费套餐 12 2吉林 3.全球通优惠 29949 要生成的报表要是这样的: 地区 1.标准全球通 2.全球通资费套餐 3.全球通优惠 长春 234 5423 454 吉林 297 12 29949 Top11 楼lamb218()回复于 2005-08-29 13:47:10 得分 0 地区 1.标准全球通 2.全球通资费套餐 3.全球通优惠 上面这一行是列名,不需要显示出来Top12 楼wgsasd311(自强不息)回复于 2005-08-29 13:48:30 得分 0 jinjazz(近身剪(充电中.)) -不需要加group by ,应加distinct才对。 代码如下: declare sql varchar(4000) set sql= select sql=sql+,+ 编码+=sum(case 编码 when + 编码+ then 用户数 else 0 end) from tbl set sql=select distinct +right(sql,len(sql)-1)+ from tbl exec(sql) Top13 楼wgsasd311(自强不息)回复于 2005-08-29 13:51:35 得分 0 楼主误人不浅啊,下次要说清楚 ,按你要求改动如下: declare sql varchar(4000) set sql= select sql=sql+,+ 编码+=sum(case 编码 when + 编码+ then 用户数 else 0 end) from tbl set sql=select 地区 +right(sql,len(sql)-1)+ from tbl group by 地区 exec(sql) Top14 楼jinjazz(近身剪)回复于 2005-08-29 14:01:47 得分 0 -建立测试环境 Create Table 表(区域 varchar(100),类型 varchar(100),价格 varchar(100) -插入数据 insert into 表 select 1长春,1.标准全球通,234 union select 1长春,2.全球通资费套餐,5423 union select 1长春,3.全球通优惠,454 union select 2吉林,1.标准全球通,297 union select 2吉林,2.全球通资费套餐,12 union select 2吉林,3.全球通优惠,29949 -测试语句 DECLARE SQL VARCHAR(8000) SET SQL=SELECT 区域 SELECT SQL= SQL+ ,min(CASE WHEN 类型 = + 类型 + THEN 价格 END) + 类型 + FROM (SELECT DISTINCT 类型 FROM 表) A SET SQL=SQL+ FROM 表 GROUP BY 区域 exec (SQL) -删除测试环境 Drop Table 表Top15 楼lamb218()回复于 2005-08-29 14:16:20 得分 0 非常谢谢各位! 不知道我如何给分了,就这么一点分,我都有点惭愧了!Top16 楼hjksoft(kiki)回复于 2006-06-21 15:33:00 得分 0 不知道如果其中一条记录中有怎么办呢,好像无法生成结果出来 例七 C#怎样在DataSet中将几行数据合并为一行.楼主Allan_Chen(逍遥)2005-12-18 18:38:47 在 .NET技术 / ASP.NET 提问现有视图格式/数据如下: Device TypeName TypeID A T1 1 B T1 1 C T1 1 D T2 2 从中取出数据后放入DataSet中, 现要在DataGrid中显示, 每个TypeID为一行记录. 也就是表中的A B C要放在一格之中. 请问将DataSet中的数据怎样处理,才能正确显示? 问题点数:20、回复次数:6Top 1 楼Allan_Chen(逍遥)回复于 2005-12-18 18:40:02 得分 0 本程序是C#程序.Top2 楼happyamei(啊梅)回复于 2005-12-18 19:01:33 得分 7private void BindGrid() UserDB grid1=new UserDB(); DataGrid1.DataSource=grid1.ReturnDataSet(select * from xbzy order by xbmc); DataGrid1.DataBind(); SpanGrid(); /实现相同数据合并行 private void SpanGrid() int intSpan=0; int nowSpan=0; string strTemp=; for(int i=0;iDataGrid1.Items.Count;) intSpan=1; strTemp=DataGrid1.Itemsi.Cells1.Text.ToString(); for(int j=i+1;jDataGrid1.Items.Count;j+) if(string.Compare(strTemp,DataGrid1.Itemsj.Cells1.Text)=0) intSpan+; DataGrid1.Itemsi.Cells1.RowSpan=intSpan; DataGrid1.Itemsj.Cells1.Visible=false; elsebreak; nowSpan+=intSpan; i=nowSpan-1; QQ:252887502 MSN: 如果还不清楚可以谈谈Top3 楼Allan_Chen(逍遥)回复于 2005-12-18 20:59:19 得分 0 十分感谢!Top4 楼Allan_Chen(逍遥)回复于 2005-12-18 22:26:25 得
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年智能医疗设备品牌代理及全国市场运营与推广服务协议
- 2025年智能电动汽车共享平台车辆租赁及市场布局合作协议
- 2025年环保型住宅小区建设项目合同规范
- 2025年跨境电商进口商品质量检测与合规咨询合同
- 2025年度小微企业职工劳动合同模板与劳动法合规承诺书
- 2025年智能机器人研发基地厂房购置协议:智能制造领域专用
- 2025年智能制造产业升级规划与实施顾问服务协议
- 2025年新型节能环保设备采购合作协议范本
- 2025年度航空货运代理员工劳动合同模板及服务标准承诺书
- 2025年高端酒店宴会厅舞台设备安装与维护服务合同
- 人教版初中八年级数学上册《第十一章 三角形》大单元整体教学设计
- 《高级统计实务和案例分析》和考试大纲
- 韦莱韬悦-东方明珠新媒体集团一体化职位职级体系方案-2018
- 2024新版(外研版三起孙有中)三年级英语上册单词带音标
- 注塑缺陷的原因分析与解决对策培训教程
- 中欧班列课件
- 个性化评价体系在高考语文作文中的作用
- 2025年九省联考新高考 物理试卷(含答案解析)
- 口腔颌面外科消毒和灭菌-手术区的消毒消毒巾铺置法(口腔科技术)
- 医院标识标牌采购投标方案(技术方案)
- 2025届广州市高三年级阶段训练(8月市调研摸底) 数学试卷(含答案)
评论
0/150
提交评论