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. 【cypress】5. 测试本地web应用

    在之前的cypress介绍里曾提到过,cypress虽然也可以测试部署好的应用,但是它最大的能力还是发挥在测试本地应用上. 本章主要内容就是关于如何测试本地web应用的概述: cypress与后台应用 ...

  2. 基于FOC伺服电机驱动的Parallel Scara Robot的设计及实现

    上个学期做了一个BLDC的FOC驱动后,我便开始了基于此类电机驱动的机器人项目尝试.之前想做的是串联机械臂,奈何找不到合适的电机并且串联机械臂十分需要减速机,使得项目对于我来说(经济方面)很艰难,恰巧 ...

  3. php和mysql数据库防SQL注入的有效解决办法

    <?php$mysqli = new mysqli("localhost", "my_user", "my_password", &q ...

  4. hdu4415 不错的想法题

    题意: 一个人他有一定的血,有一些怪物,他去杀怪物,有的怪物杀死他后还可以在不费自己血的情况下任意杀死一些怪物,问你他最多杀死多少怪物,在最多杀怪前提下最好用多少血,(大体题意是这样). 思路: 首先 ...

  5. python中让输出不换行

    Python2.x python2.x中输出默认是换行的,为了抑制换行,可以在打印最后加一个逗号 Python3.x 到了python3中,print 变成一个函数,这种语法便行不通了. 我们可以使用 ...

  6. DVWA之Brute Force(暴力破解)

    目录 Low Medium High Impossible 暴力破解是指使用穷举法,举出所有的可能的结果,然后逐一验证是否正确! Low 源代码: <?php if( isset( $_GET[ ...

  7. SSRF_FastCGI

    SSRF_FastCGI 目录 SSRF_FastCGI FastCGI协议 SSRF ssrf + fastcgi 参考 FastCGI协议 简介 Fast CGI源自旧版本的CGI 路由/结构图 ...

  8. 【Git】2. Git常用命令详解、版本切换原理

    一.新增文件 1.设置用户签名 签名的作用就是为了区分不同的人,方便查看版本的时候知道操作的人是谁.首次安装好git之后必须设置一下签名,否则无法提交代码. 另外,这里设置的签名跟你登录到远程仓的账号 ...

  9. canvas绘制折线路径动画

    最近有读者加我微信咨询这个问题: 其中的效果是一个折线路径动画效果,如下图所示: 要实现以上路径动画,一般可以使用svg的动画功能.或者使用canvas绘制,结合路径数学计算来实现. 如果用canva ...

  10. Python数模笔记-Sklearn(2)样本聚类分析

    1.分类的分类 分类的分类?没错,分类也有不同的种类,而且在数学建模.机器学习领域常常被混淆. 首先我们谈谈有监督学习(Supervised learning)和无监督学习(Unsupervised ...