当前位置: 首页 > 科技观察

一列多行同值只显示一行

时间:2023-03-20 17:34:50 科技观察

数据库环境:SQLSERVER2008R2  需求如题,左图为初始数据,右图为数据展示实现的需求  简单说说我的实现思路  1.按id和name排序,为原始数据生成行号  2。递归判断上下行ID是否相等。1  3。重新处理步骤2生成的结果集,计数器为1的id保持不变。如果计数器大于1,则id为空string  我会贴出实现代码/*准备基础数据*/WITHx0AS(SELECT1ASid,'a'ASNAMEUNIONALLSELECT1ASid,'b'ASNAMEUNIONALLSELECT1ASid,'c'ASNAMEUNIONALLSELECT2ASid,'e'ASNAMEUNIONALLSELECT2ASid,'d'ASNAMEUNIONALLSELECT3ASid,'f'ASNAMEUNIONALLSELECT4ASid,'hid'ASNAMEUNIONALLSELECT2ASid',名称排序生成行号*/x1AS(SELECTROW_NUMBER()OVER(ORDERBYid,name)ASTid,CAST(idASVARCHAR(2))id,nameFROMx0),/*递归设置计数器*/x2(tid,id,name,level)AS(SELECTtid,id,name,ASlevelFROMx1WHEREtid=1UNIONALLSELECTt1.tid,t1.id,t1.NAME,CASEWHENt1.id=t2.idTHENlevel+1ELSE1ENDlevelFROMx1t1INNERJOINx2t2ONt1.tid=t2.tid+1)/*计数器为1,id不动,否则设置为空串*/SELECTCASEWHENlevel=1THENidELSE''ENDid,nameFROMx2  首先比我的实现,有网友提供了一个更简单的实现  来看看他是如何实现的 WITHx0AS(SELECT1ASid,'a'ASNAMEUNIONALLSELECT1ASid,'b'ASNAMEUNIONALLSELECT1ASid,'c'ASNAMEUNIONALLSELECT2ASid,'e'ASNAMEUNIONALLSELECT2ASid,'d'ASNAMEUNIONALLSELECT3ASid,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT2ASid,'d'ASNAMEUNIONALLSELECT3ASid,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'f'ASNAMEUNIONALLSELECT,'j'ASNAMEUNIONALLSELECT1ASid,'j'ASNAME)SELECTREPLACE(CASEWHENROW_NUMBER()OVER(PARTITIONBYCAST(IDASVARCHAR(2))ORDERBYNAME)<>'1'THEN0ELSECAST(IDASVARCHAR(20))END,0,'')ASID,NAMEFROMx0实现思路和我的一样,但是他的方法比我的简单易懂。相信实现这个需求的方法不限于这两种,欢迎大家提出更多的解题方法。(本文结束)