相同ID行的信息sql多行合并成一行到一行

您所在的位置: &
将一列中多行相同的值只显示在一行
将一列中多行相同的值只显示在一行
简单说下我的实现思路:
1.按id、name排序给原始数据生成行号
2.用递归判断上下行的id是否相等,第一次出现计数器初始值为1,后面再出现则计数器+1
3.对步骤2中生成的结果集再处理,计数器为1的id不变,计数器大于1则id为空字符串
数据库环境:SQL SERVER 2008R2
需求如题,左图为初始数据,右图是已实现需求的数据展示
简单说下我的实现思路
1.按id、name排序给原始数据生成行号
2.用递归判断上下行的id是否相等,第一次出现计数器初始值为1,后面再出现则计数器+1
3.对步骤2中生成的结果集再处理,计数器为1的id不变,计数器大于1则id为空字符串
我把实现的代码贴出来
/*准备基础数据*/&WITH&&&&x0&&&&&&&&&&&AS&(&SELECT&&&1&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'a'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&1&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'b'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&1&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'c'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&2&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'e'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&2&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'d'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&3&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'f'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&4&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'h'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&4&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'j'&AS&NAME&&&&&&&&&&&&&&),/*按id、name排序生成行号*/&&&&&&&&&x1&&&&&&&&&&&AS&(&SELECT&&&ROW_NUMBER()&OVER&(&ORDER&BY&id,&name&)&AS&tid&,&&&&&&&&&&&&&&&&&&&&&&&&&CAST(id&AS&VARCHAR(2))&id&,&&&&&&&&&&&&&&&&&&&&&&&&&name&&&&&&&&&&&&&&&&FROM&&&&&x0&&&&&&&&&&&&&&),/*递归设置计数器*/&&&&&&&&&x2&(&tid,&id,&name,&level&)&&&&&&&&&&&AS&(&SELECT&&&tid&,&&&&&&&&&&&&&&&&&&&&&&&&&id&,&&&&&&&&&&&&&&&&&&&&&&&&&name&,&AS&level&&&&&&&&&&&&&&&&FROM&&&&&x1&&&&&&&&&&&&&&&&WHERE&&&&tid&=&1&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&t1.tid&,&&&&&&&&&&&&&&&&&&&&&&&&&t1.id&,&&&&&&&&&&&&&&&&&&&&&&&&&t1.NAME&,&&&&&&&&&&&&&&&&&&&&&&&&&CASE&WHEN&t1.id&=&t2.id&THEN&level&+&1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ELSE&1&&&&&&&&&&&&&&&&&&&&&&&&&END&level&&&&&&&&&&&&&&&&FROM&&&&&x1&t1&&&&&&&&&&&&&&&&&&&&&&&&&INNER&JOIN&x2&t2&ON&t1.tid&=&t2.tid&+&1&&&&&&&&&&&&&&)&&&&&/*计数器为1则id不动,否则置为空字符串*/&&&&&SELECT&&CASE&WHEN&level&=&1&THEN&id&&&&&&&&&&&&&&&&&&ELSE&''&&&&&&&&&&&&&END&id&,&&&&&&&&&&&&&name&&&&&FROM&&&&x2&
先比我的实现,有一网友提供了更简单的实现方式
我们来看一下他是怎么实现的 
WITH&&&&x0&&&&&&&&&&&AS&(&SELECT&&&1&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'a'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&1&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'b'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&1&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'c'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&2&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'e'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&2&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'d'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&3&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'f'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&4&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'h'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&4&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'j'&AS&NAME&&&&&&&&&&&&&&&&UNION&ALL&&&&&&&&&&&&&&&&SELECT&&&1&AS&id&,&&&&&&&&&&&&&&&&&&&&&&&&&'j'&AS&NAME&&&&&&&&&&&&&&)&&&&&SELECT&&REPLACE(CASE&WHEN&ROW_NUMBER()&OVER&(&PARTITION&BY&CAST(ID&AS&VARCHAR(2))&ORDER&BY&NAME&)&&&&'1'&&&&&&&&&&&&&&&&&&&&&&&&&&THEN&0&&&&&&&&&&&&&&&&&&&&&&&&&&ELSE&CAST(ID&AS&VARCHAR(20))&&&&&&&&&&&&&&&&&&&&&END,&0,&'')&AS&ID&,&&&&&&&&&&&&&NAME&&&&&FROM&&&&x0&
实现的思路和我一样,但他的方法比我的简单,也容易理解。
我相信,实现该需求的方法不局限于这2种,欢迎各位看官提出更多的解题方法。
(本文完)【责任编辑: TEL:(010)】
关于的更多文章
不管你有没有准备好,新版SQL Server来了!代号为Denali的下一个
数据库产品
数据库综合
数据库新闻
维基百科将切换到另外一款开源数据库MariaDB
讲师: 10人学习过讲师: 22人学习过讲师: 125人学习过
你的SQL Server代码安全吗?请你与我一起跟随作者来探
为什么会发生死锁?如何利用SQL Server Profiler分析
Oracle集群,也称Oracle RAC,称为“真正应用集群”。
《网管员必读――网络组建(第2版)》仍是以一个中等规模的模拟局域网组建为思路,较全面地介绍了与局域网组建相关的各方面知识
51CTO旗下网站如何将A列相同的数据所对应的B列多行数据合并至一行_百度知道
如何将A列相同的数据所对应的B列多行数据合并至一行
各ID的个数没有定值:ID
赵六如何可以实现:001
张一刘二王三002
王四王五003
赵六数据量大表格样式如下
提问者采纳
E1),输完公式不按回车:&quot,ROW($A$1:$A1;1;&ROW()-1)));&ROW(INDIRECT(&quot:$A$1000,MAX(IF($A2=$A$1:{=IF(MAX(IF($A2=$A$1,0)-1:$A1)))=0:$A$1000)=E$1;,&quot:{=OFFSET($A$1:{=INDEX(C;1:$A$1000))))}下拉都是数组公式,ROW($A$1:C,MATCH(0:$A1,0,MMULT(--TRANSPOSE(TRANSPOSE($A$1,不输{},ROW($A$1:&quot,MAX(IF($E2=$A$1:$A1)))))&$B2}下拉E1=IDE2,ROW(INDIRECT(&quot,1)}F2;&ROW()-1))&#47:C,1:$A$1第一行是标题C2,INDEX(C
提问者评价
谢谢啦,有的大侠没考虑到标题行的因素。
相关专业回答
这个好办,你用剪切板就可以快速做到,给我留下个邮箱,我给你发个操作过程,这个中限制你是多少行,也不使用公式。而且也不会因原数据没有了而且出错错误。如果你想用公式,你可以用concatenate例如=CONCATENATE(A12,B12,C12,D12,E12)可以连接但是不支持区域选择函数 =CONCATENATE(A1:B1,C1)了,出现错误值
,或者=PHONETIC(A12:E12),但是连接的单元格里的...
其他类似问题
为您推荐:
其他3条回答
$A$2000)数据在A列和B列 在C1输入公式=INDEX(A,4^8),鼠标移到单元格右下角,COLUMN(A1)))数组公式:$A$2000=$C1;&quot,当出现一个黑色小十字时;&quot:$A$2000),0)=ROW($A$1:$A$2000&&quot,SMALL(IF($A$1:$A$2000&&quot,SMALL(IF(MATCH($A$1,按CTRL+SHIFT+回车三键确定输入,同时按住鼠标左键往下拖动 然后在D1输入公式 =INDEX($B:A,鼠标移到单元格右下角,4^8):$B,当出现一个黑色小十字时;;,ROW($A$1:$A$2000),按CTRL+SHIFT+回车三键确定输入,ROW($A$1,$A$1,同时按住鼠标左键往右拖动,ROW(A1)))数组公式
=INDEX($B:$B,SMALL(IF($A$2:$A$7=$A2,ROW($B$2:$B$7)),1))&INDEX($B:$B,SMALL(IF($A$2:$A$7=$A2,ROW($B$2:$B$7)),2))&INDEX($B:$B,SMALL(IF($A$2:$A$7=$A2,ROW($B$2:$B$7)),3))&INDEX($B:$B,SMALL(IF($A$2:$A$7=$A2,ROW($B$2:$B$7)),4))按ctrl+shift+enter结束公式含义:INDEX($B:$B,SMALL(IF($A$2:$A$7=$A2,ROW($B$2:$B$7)),1))是取出该数组中重名“001”中对应B列中第一个数INDEX($B:$B,SMALL(IF($A$2:$A$7=$A2,ROW($B$2:$B$7)),2))是取出该数组中重名“001”中对应B列中第二个数以此类推然后用&&&将它们连在一起
C2=INDEX($A$2:$A$1000,MATCH(0,COUNTIF($C$1:C1,$A$2:$A$1000),))&&向下填充公式D2=INDEX($B$2:$B$1000,SMALL(IF(COUNTIF($C2,$A$2:$A$1000),ROW($A$2:$A$),COLUMN(A1))-1)&&&向右再向下填充公式 以上都要CTRL+SHIFT+ENTER输入公式
excel的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁苹果/安卓/wp
苹果/安卓/wp
积分 188, 距离下一级还需 72 积分
权限: 自定义头衔
道具: 彩虹炫, 雷达卡, 热点灯, 雷鸣之声, 涂鸦板, 金钱卡, 显身卡, 匿名卡下一级可获得
权限: 签名中使用图片
购买后可立即获得
权限: 隐身
道具: 金钱卡, 雷鸣之声, 彩虹炫, 雷达卡, 涂鸦板, 热点灯
开心签到天数: 8 天连续签到: 1 天[LV.3]偶尔看看II
大家好,我有数据:
input id p1 p2 p3;
1 111 112 113
1 121 122 .
1 131 132 133
2 211 . 213
2 221 222 223
3 311 312 313
3 321 322 323
3 331 332 333
3 341 342 343
要将其转换成以下样式,使得同属一个id的数据转至一行,且变量要按照顺序依次排列:
idp11p21p31p12p22p32p13p23p33p14p24p341111112113121122.131132133...2211.213221222223......3311312313321322323331332333341342343
其中p21代表第一次的p2值,p12代表第二次的p1值,后类似。新数据集中的命名最好能和上表一致,以区分次数。请问如何实现?最好能有程序说明。先谢了!
载入中......
Hi, You can write a macro for the following code if there are more variables.
input id p1 p2 p3;
1 111 112 113
1 121 122 .
1 131 132 133
2 211 . 213
2 221 222 223
3 311 312 313
3 321 322 323
3 331 332 333
3 341 342 343
data test_1;
set test(keep = ID P1);
data test_2;
set test(keep = ID p2);
data test_3;
set test(keep = ID p3);
Hi, You can write a macro for the following code if there are more variables.
input id p1 p2 p3;
1 111 112 113
1 121 122 .
1 131 132 133
2 211 . 213
2 221 222 223
3 311 312 313
3 321 322 323
3 331 332 333
3 341 342 343
data test_1;& & set test(keep = ID P1);
data test_2;& & set test(keep = ID p2);
data test_3;& & set test(keep = ID p3);
proc sort& && &data=test_1 out=test_1_& &by ID;
proc sort& && &data=test_2 out=test_2_& &by ID;
proc sort& && &data=test_3 out=test_3_& &by ID;
data test_p1;
& &set test_1_
& &if first.& & N_id=1;&&
& &else N_id+1;
data test_p2;
& &set test_2_
& &if first.& & N_id=1;&&
& &else N_id+1;
data test_p3;
& &set test_3_
& &if first.& & N_id=1;&&
& &else N_id+1;
proc transpose data=test_p1 out=test_p1trans (drop=_name_) prefix=P1;
& & & &&&var p1;
& & & &&&iD&&N_
proc transpose data=test_p2 out=test_p2trans (drop=_name_) prefix=P2;
& & & &&&var p2;
& & & &&&iD&&N_
proc transpose data=test_p3 out=test_p3trans (drop=_name_) prefix=P3;
& & & &&&var p3;
& & & &&&iD&&N_
data test_
& &merge test_p1trans test_p2trans test_p3
input id p1 p2 p3;
1 111 112 113
1 121 122 .
1 131 132 133
2 211 . 213
2 221 222 223
3 311 312 313
3 321 322 323
3 331 332 333
3 341 342 343
array pone(3);
array ptwo(3);
array pthree(3);
do i=1 to 3;
pone(i)=p1;
ptwo(i)=p2;
pthree(i)=p3;
drop i p1 p2 p3;
西格玛临床统计服务工作室http://www./,
luijb 发表于
input id p1 p2 p3;
您这个方法也很好用,但是如果变量多,比如我加了P4,貌似后面都改成四就没用了,还得跟你请教下应该怎么办呢?
论坛好贴推荐
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
为做大做强论坛,本站接受风险投资商咨询,请联系(010-)
邮箱:service@pinggu.org
合作咨询电话:(010)
广告合作电话:(刘老师)
投诉电话:(010)
不良信息处理电话:(010)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师

我要回帖

更多关于 excel两行合并为一行 的文章

 

随机推荐