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三个字段依据不同值分别做一个分组。

A B C D E row
小明 18 1 篮球 LOL 1
小明 18 1 乒乓球 DNF 2
小黄 18 2 游泳 LOL 1
小黄 18 2 滑板 QQ飞车 2
小黄 18 2 跑步 战地五 3
小孙 18 1 睡觉 剑网三 1

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

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

SELECT  CASE WHEN row = 1 THEN T.A
ELSE ''
END A ,
CASE WHEN row = 1 THEN T.B
ELSE ''
END B ,
CASE WHEN row = 1 THEN T.C
ELSE ''
END C ,
T.D ,
T.E
FROM ( SELECT * ,
ROW_NUMBER() OVER ( PARTITION BY A, B, C ORDER BY GETDATE() ) row
FROM tab
) T

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

A B C D E row
小明 18 1 篮球 LOL 1
      乒乓球 DNF 2
小黄 18 2 游泳 LOL 1
      滑板 QQ飞车 2
      跑步 战地五 3
小孙 18 1 睡觉 剑网三 1

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

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

CREATE TABLE #tab
(
headerNo VARCHAR(10) ,
machineNO VARCHAR(10) ,
descrption NVARCHAR(20) ,
artNo VARCHAR(20) ,
qty INT ,
repartno VARCHAR(20) ,
repqty INT
)

插入数据

insert INTO #tab SELECT 'HD01','0101520',N'电池出问题','102020',2,'102020',2
insert INTO #tab SELECT 'HD01','0101520',N'电池出问题','101010',2,'202020',2
insert INTO #tab SELECT 'HD01','0101520',N'电池出问题','126888',2,'102020',2
insert INTO #tab SELECT 'HD02','01012221',N'D电机故障','102020',2,'102020',2
insert INTO #tab SELECT 'HD03','12312312',N'突然停机','102020',2,'102020',2
insert INTO #tab SELECT 'HD03','12312312',N'突然停机','102020',2,'102020',2
insert INTO #tab SELECT 'HD04','12312344',N'皮带松了','102020',2,'102020',2

语句查询执行

SELECT  CASE WHEN row = 1 THEN headerNo
ELSE ''
END headerNo ,
CASE WHEN row = 1 THEN machineNO
ELSE ''
END machineNO ,
CASE WHEN row = 1 THEN descrption
ELSE ''
END descrption ,
artNo ,
qty ,
repartno ,
repqty
FROM ( SELECT * ,
ROW_NUMBER() OVER ( PARTITION BY headerNo, machineNO,
descrption ORDER BY GETDATE() ) row
FROM #tab
) M

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

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

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

后续更新

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

这样除了第一次的依据A,B,C进行了一个内部分区排序,
随后第二次操作就会依据A,B,C为参照针对L的不同字段在做一个内部分区排序。数据就是下面的样式
A B C L D E
小明 18 1 0 篮球 LOL
        乒乓球 DNF
      2 篮球 吃鸡
        跳伞 黎明杀机
      1 跳绳 和平精英
小黄 18 2   游泳 LOL
        滑板 QQ飞车
        跑步 战地五
小孙 18 1   睡觉 剑网三

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



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

  1. SQL Server 最小日志记录

    SQL Server之所以记录事务日志,首要目的是为了把失败或取消的操作还原到最原始的状态,但是,并不是所有的操作都需要完全记录事务日志,比如,在一个空表上放置排他锁,把大量的数据插入到该空表中.即使 ...

  2. SQL Server 查询表的记录数(3种方法,推荐第一种)

    http://blog.csdn.net/smahorse/article/details/8156483 --SQL Server 查询表的记录数 --one: 使用系统表. SELECT obje ...

  3. 【转】SQL Server 查询表的记录数(3种方法,推荐第一种)

    --SQL Server 查询表的记录数 --one: 使用系统表. SELECT object_name (i.id) TableName, rows as RowCnt FROM sysindex ...

  4. sql server显示某一列中有重复值的行

    sql server查询一张表 ,显示某一列中有重复值的行,可以这样写: Select * From 表名 where 列名 in(Select 列名 From Table group by 列名 h ...

  5. SQL SERVER 判断是否存在数据库、表、列、视图

    SQL SERVER 判断是否存在数据库.表.列.视图 --1. 判断数据库是否存在 IF EXISTS (SELECT * FROM SYS.DATABASES WHERE NAME = '数据库名 ...

  6. img只显示图片一部分 或 css设置背景图片只显示图片指定区域

    17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...

  7. sql server相邻表记录交换(单双两两交换)

    在博客园的博问中看到了一个这样的提问:一个表中有id和name两个字段,id是连续非空不重复的,想要交换相邻表记录的name值(单双两两交换). 另外,如果最后的单独行没有对应的下一行匹配记录的话,就 ...

  8. SQL SERVER常用语法记录

    用于记录SQL SERVER常用语法,以及内置函数. 以下语句包含: WITH 临时表语法 ROW_NUMBER()内置函数,我一般主要是用来分页.针对于查出来的所有数据做一个数字排序 分页的BETW ...

  9. SQL Server 2005中的分区表(二):如何添加、查询、修改分区表中的数据(转)

    在创建完分区表后,可以向分区表中直接插入数据,而不用去管它这些数据放在哪个物理上的数据表中.接上篇文章,我们在创建好的分区表中插入几条数据 insert Sale ([Name],[SaleTime] ...

随机推荐

  1. B - Tempter of the Bone(DFS+剪枝)

    The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it u ...

  2. 【DataBase】SQL45 Training 45题训练

    视频地址: https://www.bilibili.com/video/BV1pp4y1Q7Yv 创建案例库: ------------创建数据库--------------- create dat ...

  3. 1.5.1- HTML之相对路径

    网页需要图片,首先需要找到它.实际工作中,通常新建一个文件夹专门用于存放图像文件,这时插入图像,就需要采用"路径"的方式来制定图像文件的位置.路径可以分为相对路径与绝对路径. 相对 ...

  4. 11- client测试

    client是客户端,软件分为客户端与服务端,客户端就是我们使用的软件,比如浏览器,QQ,抖音等.服务端就是客户端使用操作,服务端给你响应的请求.

  5. 11- jmeter主要元件

    元件分类 HTTP请求默认值(请求行,请求头,空行,消息体) HTTP信息头管理器: HTTPcookie管理器(1.更真实的模拟用户行为 ,多个请求的关联.第一个请求没有cookie第二个就带了co ...

  6. top:0;bottom:0;left:0;right:0;同时使用的效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 从苏宁电器到卡巴斯基第12篇:我在苏宁电器当营业员 IV

    卖iPhone首先是需要接受培训的 像iPhone这样的重点产品,并不是只要选好了人(营业员),说卖就能卖的,在正式销售之前需要接受厂家的培训.如果说人事关系或者产品源隶属于苹果,那么是由苹果中国公司 ...

  8. POJ3692 最大点权独立集元素个数

    题意:      n个男孩和m个女孩,给你他们谁和谁彼此了解,问你要找到一个集合,使得这个集合中的男孩和女孩相互了解,并且人数最多. 思路:      简单题目,其实就是在求最大点权独立集元素个数,先 ...

  9. CentOS运行多个Tomcat操作步骤

    一:修改环境变量 在/et/profile文件追加以下内容 # tomcat1 env ( 第一个tomcat 的环境变量) export CATALINA_HOME=/usr/local/apach ...

  10. php基础-php基本语法

    http://study.163.com/course/courseMain.htm?courseId=246003