多行合并为一行的SQL语句Word文件下载.docx
- 文档编号:17273273
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:18
- 大小:64.53KB
多行合并为一行的SQL语句Word文件下载.docx
《多行合并为一行的SQL语句Word文件下载.docx》由会员分享,可在线阅读,更多相关《多行合并为一行的SQL语句Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 合并 一行 SQL 语句