多行合并为一行的SQL语句Word文件下载.docx

上传人:b****6 文档编号:17273273 上传时间:2022-11-30 格式:DOCX 页数:18 大小:64.53KB
下载 相关 举报
多行合并为一行的SQL语句Word文件下载.docx_第1页
第1页 / 共18页
多行合并为一行的SQL语句Word文件下载.docx_第2页
第2页 / 共18页
多行合并为一行的SQL语句Word文件下载.docx_第3页
第3页 / 共18页
多行合并为一行的SQL语句Word文件下载.docx_第4页
第4页 / 共18页
多行合并为一行的SQL语句Word文件下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

多行合并为一行的SQL语句Word文件下载.docx

《多行合并为一行的SQL语句Word文件下载.docx》由会员分享,可在线阅读,更多相关《多行合并为一行的SQL语句Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。

多行合并为一行的SQL语句Word文件下载.docx

T5'

T6'

SELECT2

M1'

SELECTNo,Substr(Jg,2,Length(Jg))ASJg

FROM(SELECTNo,MAX(Sys_Connect_By_Path(q,'

'

))ASJgFROM(SELECTNo,q,Row_Number()Over(PARTITIONBYNoORDERBYNo,q)Rn

FROMTest)STARTWITHRn=1CONNECTBYRn-1=PRIORRnANDNo=No

GROUPBYNo)

谭工前面那个示例"

CONNECTBYRn-1=PRIORRnANDNo=No”也应改成"

CONNECTBYNo||T||(Rn-1)=PRIOR(NO||T||Rn)”结果才对。

另外这个SQL只适合在小数据集或索引结果中进行处理,不然要使用全表扫描效率不高。

输出:

1,N1,N2,N3,N4,N5

2,M1

3,T1,T2,T3,T4,T5,T6

例二

另解:

人员所属部门:

第一个部门为缺省部门

SELECT人员编号,

MIN(姓名)AS姓名,

Substr(MAX(To_Char(Length(部「2,'

99999999'

)||部「T),11,2000)AS部门

FROM(SELECT人员编号,姓名,Sys_Connect_By_Path(部门,'

)AS部门

FROM(SELECT姓名,

部「T,

缺省,

人员编号,

Row_Number()Over(PARTITIONBY姓名ORDERBY人员编号,缺省DESC)RnFROM(SELECTc.姓名,

b.名称AS部「T,

a.缺省,

c.编号AS人员编号,

b.编码AS部门编码

FROM部门人员a,部门表b,人员表c

WHEREa.部门id=b.Id

ANDa.人员id=c.Id

)t)

STARTWITHRn=1

CONNECTBY(人员编号||(Rn-1))=PRIOR(人员编号||Rn))

GROUPBY人员编号

ORDERBY部门

CONNECTBY(人员编号||(Rn-1))=PRIOR(人员编号||Rn)

这一句整很久才整出来,为了避免不等长的编号,下面的改进也许更合适:

CONNECTBY(人员编号||'

|'

||(Rn-1))=PRIOR(人员编号||'

||Rn)

这样就不会出现错乱了.

例三

如何将一个表中的多行数据合并为一行新数据?

比如有表A

ID

Field1

Field2

Field3

b

10.1

12.2

9.8

8.6

c

12.3

11.2

4

5.3

8.2

现在想生成下面这样的数据

4c5.38.2

5b_all19.920.8注:

19.9=10.1+9.820.8=12.2+8.6

6c_all17.619.4

请问如何用SQL语句或存贮过程来实现?

Try:

Select*from表A

Unionall

Select

5,'

b_all'

sum(field2),sum(field3)

from

表A

where

field1

='

b'

group

by5,'

Union

all

6,'

c'

 

Select*

(select

max(id)from表A)+1,'

sum(field2),sum(field3)from表

Awhere

max(id)from表A)+2,'

c_all'

sum(field2),sum(field3)from表

selectIDENTITY(INT,1,1)ID,T.*into#tempFROM

((selectField1,Field2,Field3from表AUnionall

selectField1+'

_all'

sum(Field2),sum(Field3)

from表AgroupbyField1))T

select*from#temp

droptable#temp

测试:

(所影响的行数为6行)

例四

如何把查询到的多行数据合并为一行?

楼主Chice_wxg(学)(习)2004-11-0713:

27:

22在MS-SQLServer/基础类提问

我需要类似以下功能:

updatetable1setdata=(selectlinefromtable2)

但是select如果返回多行显然无法直接进行这种操作,

请问如何解决?

谢谢

data和line都是字符传。

比如:

table2中有很多记录(line)

idline

1asdf

2zxcv

3lkjha

我希望最终例如:

updatetablelwhereid=指定记录setdata=(.....不知道怎么写....)

最终:

tablel中那条记录的data字段的内容是类似"

asdfzxcvlkjha"

的形式。

也就是说要把table2中的所有内容放到一个字符串中。

--这样的更新无法用一个语句实现

--你可以这样处理

declare@svarchar(8000)

set@s='

select@s=@s+'

'

+linefromtable2

updatetable1setdata=stuff(@s,1,1,'

whereid=指定记录:

Top;

5楼zjcxc(邹建)回复于2004-11-0713:

48:

32

得分30

--或者写个自定义函数

createfunctionf_str()returnsvarchar(8000)

as

begin

set@s="

return(stuff(@s,1,1,”))

end

go

--调用函数实现更新

updatetable1setdata=dbo.f_str()whereid=指定记录

例五

[如何将多行记录合并为一行?

:

网友提问于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

--楼主在论坛里搜搜,很多的

createtabletb(IDvarchar(10),NAMEvarchar(10))insertintotb

select'

A.ID1'

'

B.VALUE11'

unionallselect'

B.VALUE12'

B.VALUE13'

A.ID2'

B.VALUE21'

B.VALUE22'

go

createfunctiondbo.fc_str(@idvarchar(100))

returnsvarchar(100)

declare@sqlvarchar(1000)

set@sql='

select@sql=@sql+'

+cast(nameasvarchar(100))fromtbwhereid=@idreturnstuff(@sql,1,1,'

selectid,dbo.fc_str(id)asnamefromtbgroupbyid

droptabletb

dropfunctiondbo.fc_str

例六如何将多行数据合并成一行多列

楼主lamb218()2005-08-2911:

55:

28在MS-SQLServer/应用实例提问数据:

编码用户数

01100

02120

03160

04320

合并后的效果应如下:

T

100120160320问题点数:

40、回复次数:

16Top

1楼wgsasd311(自强不息)回复于2005-08-2912:

26:

50得分15

declare@sqlvarchar(4000)

set@sql="

['

+编码+'

]=sum(case编码when'

then用户数else0end)fromtbl'

+right(@sql,len(@sql)-1)+'

fromtbl'

exec(@sql)Top

2楼jinjazz(近身剪)回复于2005-08-2912:

30:

18得分15

--建立测试环境

CreateTable表(编码varchar(10),用户数varchar(10))

--插入数据

insertinto表

01'

100'

union

02'

120'

03'

160'

04'

320'

declare@strvarchar(8000)

--测试语句

set@str='

select@str=@str+用户数+'

from表

print@str

/*--输出

100120160320

--*/

--删除测试环境

DropTable表

iT?

p...i

3楼xueguang(xg)回复于2005-08-2912:

27得分0

declare@avarchar(4000)

set@a='

select@a=@a+'

+用户数from表

厂-:

selectstuff(@a,1,1,"

)iTop

4楼lamb218()回复于2005-08-2913:

04:

59得分0

你们实现的都是合并后一行一列,我要求把分成多列!

能实现吗?

Top:

5楼wgsasd311(自强不息)回复于2005-08-2913:

21:

21得分0

楼主,你有没有看懂我代码,他实现的是一行多列,列数由编码个数动态确定。

Top'

6楼jinjazz(近身剪)回复于2005-08-2913:

23:

19

得分0

那你groupbyTop

7楼xueguang(xg)回复于2005-08-2913:

40

得分10

--分成多列一楼的就可以,如果编码有重复,可以这样写

]=sum(case

数else0end)'

from(selectdistinct

编码when'

+编码+'

then用户编码from表)A

+right(@sql,len(@sql)-1)+

from表'

exec(@sql)

8楼jinjazz(近身剪)回复于2005-08-2913:

25:

13

CreateTable表(idvarchar(10),amountinteger,remarkvarchar(10))

1'

3'

aaa'

selectT,'

5'

bbb'

4'

ccc'

2'

10'

pkoge'

12'

daf'

CREATEFUNCTIONFunMergeCharField(@vchAvarchar(10))

RETURNSvarchar(8000)

BEGIN

DECLARE@rvarchar(8000)

SET@r='

SELECT@r=@r+'

+remarkFROM表WHEREid=@vchA

RETURN(substring(@r,2,8000))

END

GO

selectid,sum(amount)assum,dbo.FunMergeCharField(id)asremark叠力口from表groupbyid

DropFUNCTIONFunMergeCharField|Top|

9楼wgsasd311(自强不息)回复于2005-08-2913:

41:

57得分0

jinjazz(近身剪(充电中...))---thanks.

改正如下:

fromtblgroupby'

Top_

10楼lamb218()回复于2005-08-2913:

45:

53得分0

我重新发一遍吧,估计我说的不够清楚。

谢谢了!

1长春1.标准全球通234

1长春2.全球通资费套餐5423

1长春3.全球通优惠454

2吉林1.标准全球通297

2吉林2.全球通资费套餐12

2吉林3.全球通优惠29949

要生成的报表要是这样的:

地区1.标准全球通2.全球通资费套餐3.全球通优惠

长春2345423454

吉林2971229949

[Topi

11楼lamb218()回复于2005-08-2913:

47:

10得分0

上面这一行是列名,不需要显示出来Top

12楼wgsasd311(自强不息)回复于2005-08-2913:

30得分0

jinjazz(近身剪(充电中...))---不需要加groupby,应加distinct才对。

代码如下:

selectdistinct'

fromtbl'

TopLI

13楼wgsasd311(自强不息)回复于2005-08-2913:

51:

35得分0

楼主误人不浅啊,下次要说清楚,按你要求改动如下:

then用户

数else0end)fromtbl'

select地区'

fromtblgroupby地区

:

Top

14楼jinjazz(近身剪)回复于2005-08-2914:

01:

47得分0

CreateTable表(区域varchar(100),类型varchar(100),价格varchar(100))

1长春'

1.标准全球通'

234'

1长春'

2.全球通资费套餐'

5423'

3.全球通优惠'

454'

2吉林'

1.标准全球通’,'

297'

2吉林'

29949'

DECLARE@SQLVARCHAR(8000)

SET@SQL='

SELECT区域'

SELECT@SQL=@SQL+

min(CASEWHEN类型='

+类型+型+'

]'

FROM(SELECTDISTINCT类型FROM表)

SET@SQL=@SQL+'

FROM表GROUPBY

exec(@SQL)

DropTable表Top

15楼lamb218()回复于2005-08-2914:

16:

20得分0

非常谢谢各位!

不知道我如何给分了,就这么一点分,我都有点惭愧了!

i.T.op..

16楼hjksoft(kiki)回复于2006-06-2115:

33:

00得分0

不知道如果其中一条记录中有NULL怎么办呢,好像无法生成结果出来

例七C#

怎样在DataSet中将几行数据合并为一行.

楼主Allan_Chen(逍遥)2005-12-1818:

38:

47在.NET技术/ASP.NET提问

现有视图格式/数据如下:

Device

TypeName

TypeID

A

T1

B

C

D

T2

从中取出数据后放入DataSet中,现要在DataGrid中显示,每个TypeID为一行记录.也就是表中

的ABC要放在一格之中.

请问将DataSet中的数据怎样处理,才能正确显示?

问题点数:

20、回复

次数:

6Top

1楼Allan_Chen

(逍遥)回复于

2005-12-1818:

40:

02得分0

本程序是C#程序

•:

Top,

2楼happyamei

(啊梅)回复于

2005-12-1819:

33得分7

privatevoid

{

BindGrid()

UserDB

grid1=new

UserDB();

DataGrid1.DataSource=grid1.ReturnDataSet("

select*fromxbzyorderbyxbmc"

);

DataGrid1.DataBind();

SpanGrid();

}

//实现相同数据合并行

privatevoidSpanGrid(){

intintSpan=0;

intnowSpan=0;

stringstrTemp="

”;

for(inti=0;

i<

DataGrid1.Items.Count;

){intSpan=1;

strTemp=DataGrid1.Items[i].Cells[1].Text.ToString();

for(intj=i+1;

j<

j++)

if(string.Compare(strTemp,D

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1