sql中如何实现查询结果从小到大按行排列?

sqlserver 2008
比如表:table1
a b c d


1 4 7 70
2 5 8 60
3 6 9 50
1 4 7 40
2 5 8 30
3 6 9 20
1 4 7 10

表:table2
a b c d e f g


1 4 7
2 5 8
3 6 9

最后结果表:table2变为
a b c d e f g


1 4 7 10 40 70 null
2 5 8 20 50 null null
3 6 9 30 60 null null

请说明一下你用的什么数据库以及数据库版本


sql server 2008版本太老了,很多写法都不支持,而且也难得找个线上测试环境测试,我先分析一下吧。
首先你这个结果应该是写错了,最后生成的数据应该是
1 4 7 10 40 70 null
2 5 8 30 60 null null
3 6 9 20 50 null null

即按照前3个字段,聚合第4个字段,并且让第4个字段从左至右排列。
但是这里有个问题,你例子里的结果一共只有7个列,假设满足147的一共有5个值,按照你这个要求需要8个列才能放下,而这违背了sql标准,即一个查询sql必须有确定的列数,列数不能为动态的。
所以,大多数情况下,你这种需求不会要求产生多个列,而是直接以字符串形式,使用分隔符将这些值都塞在同一个字段里,也就是说类似mysql中的ws_concat或者oracle中的listagg,而sqlserver尤其是较老版本的sqlserver里,处理这种就特别恶心了。
就像下面这道题一样

按照上面这个方式对应到你这个题,sql如下

with t as (
select 1 a, 4 b,7 c, 70 d union all
select 2, 5, 8, 60 union all
select 3, 6, 9, 50 union all
select 1, 4, 7, 40 union all
select 2, 5 ,8, 30 union all
select 3, 6 ,9 ,20 union all
select 1, 4 ,7 ,10
)
 
select t.a,t.b,t.c,
stuff((select ','+cast(t2.d as VARCHAR) from t as t2 where t2.a=t.a and t2.b=t.b and t2.c=t.c order by d for xml path('')),1,1,'') d 
from t group by t.a,t.b,t.c

img

其实指定分隔符为逗号后,你输出到csv,自动就会变成多个列

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632