LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

SQL SERVER 实现相同记录为空显示(多列去除重复值,相同的只显示一条数据)

Ccoffee
2023年3月20日 16:15 本文热度 1191
:SQL SERVER 实现相同记录为空显示(多列去除重复值,相同的只显示一条数据)


sql server语句查询中碰到结果集有重复数据,需要把这个重复数据汇总成一条显示。其余则正常显示。

使用SQL内置函数 ROW_NUMBER() 加 PARTITION 完成

ROW_NUMBER() OVER ( PARTITION BY '相同数据字段' ORDER BY GETDATE() ) row

PARTITION BY和GROUP BY类似。

GROUP BY会影响行数,针对于所有字段进行一个聚合。

PARTITION BY则不会影响行数,用做于此处刚刚好。

例:查询出字段有A、B、C、D、E。其中A代表姓名、B代表年龄、C代码性别、D代表爱好、E代表喜欢游戏。

其中A、B、C,这三个字段中有重复字段,而D、E则无重复字段。

那么语句便可以这样写

select *,ROW_NUMBER() OVER ( PARTITION BY A,B,C ORDER BY GETDATE() ) row from tab

这样你便会看到你的结果中row字段会依据A、B、C三个字段依据不同值分别做一个分组。

ABCDErow
小明181篮球LOL1
小明181乒乓球DNF2
小黄182游泳LOL1
小黄182滑板QQ飞车2
小黄182跑步战地五3
小孙181睡觉剑网三1

所以以上数据便是依据PARTITION BY分组所显示行号。

既然已经得到这样的数据,那么把相同的数据更改为空就很简单了。使用CASE WHEN便可以实现。

  1. select  CASE WHEN row = 1 THEN T.A

  2.             ELSE ''

  3.        END A ,

  4.        CASE WHEN row = 1 THEN T.B

  5.             ELSE ''

  6.        END B ,

  7.        CASE WHEN row = 1 THEN T.C

  8.             ELSE ''

  9.        END C ,

  10.        T.D ,

  11.        T.E

  12. from    ( select    * ,

  13.                    ROW_NUMBER() OVER ( PARTITION BY A, B, C ORDER BY GETDATE() ) row

  14.          from      tab

  15.        ) T

那么以上语句执行最终结果便是一下表格里的数据:

ABCDErow
小明181篮球LOL1



乒乓球DNF2
小黄182游泳LOL1



滑板QQ飞车2



跑步战地五3
小孙181睡觉剑网三1

这样一来就简介多了,SQL SERVER很多内置函数还是非常好用的。

最后放上一个测试临时表格供大家测试吧!

  1. create TABLE #tab

  2.    (

  3.      headerNo VARCHAR(10) ,

  4.      machineNO VARCHAR(10) ,

  5.      descrption NVARCHAR(20) ,

  6.      artNo VARCHAR(20) ,

  7.      qty INT ,

  8.      repartno VARCHAR(20) ,

  9.      repqty INT

  10.    )

插入数据

  1. insert INTO #tab select 'HD01','0101520',N'电池出问题','102020',2,'102020',2

  2. insert INTO #tab select 'HD01','0101520',N'电池出问题','101010',2,'202020',2

  3. insert INTO #tab select 'HD01','0101520',N'电池出问题','126888',2,'102020',2

  4. insert INTO #tab select 'HD02','01012221',N'D电机故障','102020',2,'102020',2

  5. insert INTO #tab select 'HD03','12312312',N'突然停机','102020',2,'102020',2

  6. insert INTO #tab select 'HD03','12312312',N'突然停机','102020',2,'102020',2

  7. insert INTO #tab select 'HD04','12312344',N'皮带松了','102020',2,'102020',2

语句查询执行

  1. select  CASE WHEN row = 1 THEN headerNo

  2.             ELSE ''

  3.        END headerNo ,

  4.        CASE WHEN row = 1 THEN machineNO

  5.             ELSE ''

  6.        END machineNO ,

  7.        CASE WHEN row = 1 THEN descrption

  8.             ELSE ''

  9.        END descrption ,

  10.        artNo ,

  11.        qty ,

  12.        repartno ,

  13.        repqty

  14. from    ( select    * ,

  15.                    ROW_NUMBER() OVER ( PARTITION BY headerNo, machineNO,

  16.                                        descrption ORDER BY GETDATE() ) row

  17.          from      #tab

  18.        ) M

以上测试SQL语句来自博客园以下老哥的文章,它的文章只编写了SQL语句供予测试。

我加以修改,做了一些理解性的分析。

https://www.cnblogs.com/panxuguang/p/5668520.html

后续更新

PARTITION BY简称分区函数,GROUP BY为聚合函数。
  1. PARTITION BY的使用之处可以有很多,文章的上半部分查询出来的数据用于报表非常合适。
    但用作于程序中就会显得比较复杂。
    以此可以思考,既然 PARTITION BY是依据当前字段不同的字段做一个分组,不影响数据结构、数据行。
    结合ROW_NUMBER对分组后的数据进行一个排序。这样就可以根据ROU_NUMBER后的字段进行数据查询。
    同时,PARTITION BY 还可以在一个查询语句中针对于多个字段进行查询。但后续的PARTITION BY须携带上前一个字段。
    比如上面例子中再增加一个字段,父母标识。L字段中,0代表自己,1代表母亲,2代表父亲。DE就表示父母的爱好。            

  1. select  CASE WHEN row = 1 THEN T.A

  2.             ELSE ''

  3.        END A ,

  4.        CASE WHEN row = 1 THEN T.B

  5.             ELSE ''

  6.        END B ,

  7.        CASE WHEN row = 1 THEN T.C

  8.             ELSE ''

  9.        END C ,

  10.      CASE WHEN row2 = 1 THEN T.L

  11.                ELSE ''

  12.        END F,

  13.        T.D ,

  14.        T.E

  15. from    ( select    * ,

  16.                    ROW_NUMBER() OVER ( PARTITION BY A, B, C ORDER BY GETDATE() ) row,

  17.                    ROW_NUMBER() OVER ( PARTITION BY A, B, C, L ORDER BY GETDATE() ) row2

  18.          from      tab

  19.        ) T  


  1. 这样除了第一次的依据A,B,C进行了一个内部分区排序,
    随后第二次操作就会依据A,B,C为参照针对L的不同字段在做一个内部分区排序。数据就是下面的样式

ABCLDE
小明1810篮球LOL




乒乓球DNF



2篮球吃鸡




跳伞黎明杀机



1跳绳和平精英
小黄182
游泳LOL




滑板QQ飞车




跑步战地五
小孙181
睡觉剑网三

通过PARTITON BY 分区排序之后,你还可以取以什么为条件了前三条,以什么字段为排序的第一条等等操作


该文章在 2023/3/20 16:15:26 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved