Sqlserver 多行合并为一行

多行合并为一行

表结构

子表结构如下:

Sqlserver 多行合并为一行_第1张图片

父表结构如下:

Sqlserver 多行合并为一行_第2张图片

由图可以看出子表和父表是通过父表ID进行关联的

我们要实现的效果如下,查询父表数据的同时,增加一列来展示父表下子商品信息。
在这里插入图片描述

完整代码如下

select top {0} * from ( select  row_number() over(order by OP.ID desc) as rownumber,OP.ID,OP.procode,OP.proname,COUNT (1) OVER () AS totalcount,goodsqty=( SELECT CONVERT(NVARCHAR(100),o1.商品名)+','
FROM (SELECT DISTINCT pid,(goodsname+'['+CONVERT(varchar(100), goodsqty)+']') 商品名 FROM  OMS_ProductsDetail WITH (NOLOCK) WHERE pid=OP.ID)o1 WHERE o1.pid=OP.ID 
FOR xml Path('')),protype,proprice,starttime,isinvaild,
                                case isinvaild when 0 then '生效中' else '已失效' end as invailddesc,
                                invaildtime
from OMS_Products OP  where 1=1 {1} ) x where  rownumber>{2}

代码解析

第一步:把商品信息和库存组合到一起
goodsqty=( SELECT CONVERT(NVARCHAR(100),o1.商品名)+','
FROM (SELECT DISTINCT pid,(goodsname+'['+CONVERT(varchar(100), goodsqty)+']') 商品名 FROM  OMS_ProductsDetail WITH (NOLOCK) WHERE pid=OP.ID)o1 WHERE o1.pid=OP.ID 
FOR xml Path(''))

这里用到了两个知识点
1、WITH (NOLOCK):其目的就是查询是不锁定表,从而达到提高查询速度的目的。
2、FOR xml Path(‘’):把数据转换为xml。实现一行展示多条信息

第二步:实现分页

2012以下版本:
使用以下方式进行分页:


select top (@pagrrsize) * from 
(
  select row_number() over(order by Tablekey) as rownumber, * from tableName
) A
where rownumber > (@pagesize * (@pageindex-1))

2012以上版本:

select * from tableName order by Tablekey

offset (@pagesize(@pageindex-1))  

rows fetch next (@pagesize) 

rows only

你可能感兴趣的:(sqlserver,sqlserver,数据库)