今天有位做erp的朋友在群中问,怎么在sql中实现数据的主从显示呢?具体的就是如果数据的主表信息与上条数据的主表信息相同,就把该条数据的主表信息清空,这样看来起数据的从属关系就很明显了。如下图:
如果原始数据是这样的:
需实现的效果就是这样的:
自己想了一个比较简单的思路,如下:
先创建示例表并填充数据:
create table #a
(
ID int,
name varchar(50),
address varchar(50),
sort decimal(18,4)
)
insert into #a(ID,name,address,sort)
select 1,'张','上海',20
union all
select 2,'张','上海',30
union all
select 3,'张','上海',40
union all
select 4,'李','深圳',40
union all
select 5,'李','深圳',40
可利用sql"select * from #a"查看结果如下:
然后创建另一个表,用来存储结果集
create table #b
(
ID int,
name varchar(50),
address varchar(50),
sort decimal(18,4),
PID int
)
在这个表中我增加了PID列,因为结果表中的主表信息会被清空,所以我们需要借助PID列来确定数据的从属关系。
先将所有主表信息添加进#b表中,因为是主表的信息,所以我们初始化PID列的值为0:
insert into #b(ID,name,address,sort,PID)
select *,0 from #a t1
where id=(select min(id) from #a t2 where t1.name=t2.name and t1.address=t2.address)
然后将其它的从表数据添加到#b中,记得要将主表的ID值填到从表的PID列了。
insert into #b(ID,name,address,sort,PID)
select t1.ID,'','',t1.Sort,t2.ID from #a t1,#b t2
where t1.name=t2.name and t1.address=t2.address and t1.id<>t2.id
到这里,其实我们的数据已经添加进#b表了,只是还未能按正确的顺序来显示,如下图:
我们还需要给数据正确的排序:
update #b set PID=ID where pid=0
select * from #b order by pid asc,id asc
这样,我们就完成想要的功能了,最后结果如下图:
最后记的删除临时表哦
drop table #a
drop table #b