前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL如何只让特定列中只显示一行数据

SQL如何只让特定列中只显示一行数据

作者头像
繁华是客
发布于 2023-03-03 12:09:18
发布于 2023-03-03 12:09:18
9.3K00
代码可运行
举报
运行总次数:0
代码可运行

我们如果在某个表里面,如何让其中某列的其中一行数据,只是显示一次呢?

示例表

StudentID

Last_Name

First_Name

Gender

GradeLevel

Class

Pupil_Email

Relationship

Pupil_Parent_Email

5013

Wang

Zack

M

Grade 9 Senior

SG9 B

5013@example.com

爸爸

5013a@qq.com

5013

Wang

Zack

M

Grade 9 Senior

SG9 B

5013@example.com

妈妈

5013b@qq.com

5014

Liu

Aileen

F

Grade 2 Bilingual

BG2 D

5014@example.com

爸爸

5014a@qq.com

5014

Liu

Aileen

F

Grade 2 Bilingual

BG2 D

5014@example.com

妈妈

5014b@qq.com

5014

Liu

Aileen

F

Grade 2 Bilingual

BG2 D

5014@example.com

妈妈

5014b@qq.com

5017

Ying

Eason

F

Grade 9 Senior

SG9 A

5017@example.com

爸爸

5017e@qq.com

5017

Ying

Eason

F

Grade 9 Senior

SG9 A

5017@example.com

爸爸

5017e@qq.com

5029

Yan

Yuki

M

Grade 3 Bilingual

BG3 H

5029@example.com

爸爸

5029a@qq.com

5029

Yan

Yuki

M

Grade 3 Bilingual

BG3 H

5029@example.com

妈妈

5029b1@qq.com

5029

Yan

Yuki

M

Grade 3 Bilingual

BG3 H

5029@example.com

妈妈

5029b2@qq.com

5029

Yan

Yuki

M

Grade 3 Bilingual

BG3 H

5029@example.com

妈妈

5029b3@qq.com

解析

如你所见,学号5014和5029的学生妈妈出现多次,而5017学生同样数据显示了2次。那么我们如何让其数据,也就是“妈妈”,只显示其中一个呢?

Step 1 DISTINCT

DISTINCT是可以将重复数据去除,只显示一行。但是这个是全部Select表的重复数据。所以如果想要“妈妈”信息只是显示一条是不可行的。

我们先将5017学生的重复数据去除

Step 2 MIN()和Group By

我们将想要只显示一条数据的列进行MIN()或MAX() 【根据字母大小显示第一条】

Group By后面跟着所有除去MIN()那一列的数据即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Select DISTINCT
StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship
,MIN(Pupil_Parent_Email) AS Pupil_Parent_Email

From TableA

Group By StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship

结果:

StudentID

Last_Name

First_Name

Gender

GradeLevel

Class

Pupil_Email

Relationship

Pupil_Parent_Email

5013

Wang

Zack

M

Grade 9 Senior

SG9 B

5013@example.com

爸爸

5013a@qq.com

5013

Wang

Zack

M

Grade 9 Senior

SG9 B

5013@example.com

妈妈

5013b@qq.com

5014

Liu

Aileen

F

Grade 2 Bilingual

BG2 D

5014@example.com

爸爸

5014a@qq.com

5014

Liu

Aileen

F

Grade 2 Bilingual

BG2 D

5014@example.com

妈妈

5014b@qq.com

5017

Ying

Eason

F

Grade 9 Senior

SG9 A

5017@example.com

爸爸

5017e@qq.com

5029

Yan

Yuki

M

Grade 3 Bilingual

BG3 H

5029@example.com

爸爸

5029a@qq.com

5029

Yan

Yuki

M

Grade 3 Bilingual

BG3 H

5029@example.com

妈妈

5029b1@qq.com

上面我们所有的工作已经完成了!如果我想要将该表的邮箱行列进行互换呢?

如果想要互换,当然可以直接通过PIVOT来实现,但是如果我们想要先计算学生有多少个长辈邮箱,且每个长辈邮箱只显示一个,我们应该怎么做呢?

Step 3 ROW_NUMBER()

SQL Server Tutorial ROW_NUMBER()教学

我们可以根据父母关系邮箱来进行排序

以下是基本用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ROW_NUMBER() OVER (
Order By TableA.ColumnID
) AS Count_Row_No

通过上面的方式,只是计算总数的行数(Row Number), 在实际使用中,我们更多是根据某一列的数据来计算他的数据出现的次数。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ROW_NUMBER() OVER (
PARTITION By TableA.ColumnID
Order By TableA.ColumnID
) AS Count_Row_No

这是根据ColumnID,看看同一ColumnID出现的次数。

所以本案例的做法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Select DISTINCT
StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship
,MIN(Pupil_Parent_Email) AS Pupil_Parent_Email
,ROW_NUMBER() OVER (
PARTITION By TableA.StudentID
Order By TableA.StudentID
) AS Count_Row_No

From TableA

Group By StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship

Excel实现方式

实际上,Excel可以通过非常简单的方法实现计数。=COUNTIF(E 2:

Step 4 PIVOT

最后,我们需要将邮箱从列变成行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Select * From 
(
Select DISTINCT
StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
/**
我们需要将关系,从表中隐藏,这样才能在PIVOT中将行变成列
**/
--,Relationship
,MIN(Pupil_Parent_Email) AS Pupil_Parent_Email
,ROW_NUMBER() OVER (
PARTITION By TableA.StudentID
Order By TableA.StudentID
) AS RelationEmailCount

From TableA

Group By StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship
) As BaseTable
PIVOT (
	MAX(Pupil_Parent_Email)
	FOR [RelationEmailCount] in ([1],[2])
) As Result
Order By Last_Name

结果如下:

StudentID

Last_Name

First_Name

Gender

GradeLevel

Class

Pupil_Email

1

2

5014

Liu

Aileen

F

Grade 2 Bilingual

BG2 D

5014@example.com

5014a@qq.com

5014b@qq.com

5013

Wang

Zack

M

Grade 9 Senior

SG9 B

5013@example.com

5013a@qq.com

5013b@qq.com

5029

Yan

Yuki

M

Grade 3 Bilingual

BG3 H

5029@example.com

5029a@qq.com

5029b1@qq.com

5017

Ying

Eason

F

Grade 9 Senior

SG9 A

5017@example.com

5017e@qq.com

NULL

STRING_AGG的实现方式

StudentID

Last_Name

First_Name

Gender

GradeLevel

Class

Pupil_Email

Relationship

Pupil_Parent_Email

5013

Wang

Zack

M

Grade 9 Senior

SG9 B

5013@example.com

爸爸

5013a@qq.com

5013

Wang

Zack

M

Grade 9 Senior

SG9 B

5013@example.com

妈妈

5013b@qq.com

5014

Liu

Aileen

F

Grade 2 Bilingual

BG2 D

5014@example.com

爸爸

5014a@qq.com

5014

Liu

Aileen

F

Grade 2 Bilingual

BG2 D

5014@example.com

妈妈

5014b@qq.com

5017

Ying

Eason

F

Grade 9 Senior

SG9 A

5017@example.com

爸爸

5017e@qq.com

5029

Yan

Yuki

M

Grade 3 Bilingual

BG3 H

5029@example.com

爸爸

5029a@qq.com

5029

Yan

Yuki

M

Grade 3 Bilingual

BG3 H

5029@example.com

妈妈

5029b1@qq.com

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Select
StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
--,Relationship
,STRING_AGG(Pupil_Parent_Email, ',') AS Pupil_Parent_Email

From TableA

Group By StudentID
,Last_Name
,First_Name
,Gender
,GradeLevel
,Class
,Pupil_Email
,Relationship

StudentID

Last_Name

First_Name

Gender

GradeLevel

Class

Pupil_Email

Pupil_Parent_Email

5013

Wang

Zack

M

Grade 9 Senior

SG9 B

5013@example.com

5013a@qq.com ,5013b@qq.com

5014

Liu

Aileen

F

Grade 2 Bilingual

BG2 D

5014@example.com

5014a@qq.com ,5014b@qq.com

5017

Ying

Eason

F

Grade 9 Senior

SG9 A

5017@example.com

5017e@qq.com

5029

Yan

Yuki

M

Grade 3 Bilingual

BG3 H

5029@example.com

5029a@qq.com ,5029b1@qq.com

然后可以通过逗号的分割进行新建一行的分割列

SQL如何将一个列中值内的逗号分割成另一列

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何根据Excel某列数据为依据分成一个新的工作表
1. Youtube - Derrick Sherrill 2. GitHub
繁华是客
2023/03/03
7.2K0
CentOS查询端口占用和清除端口占用的程序
1、查询端口号占用,根据端口查看进程信息 [root@server2 ~]# lsof -i:80 COMMAND  PID   USER   FD   TYPE DEVICE SIZE NODE NAME httpd   5014   root    3u  IPv4  14346       TCP server2:http (LISTEN) 2、根据进程号查看进程对应的可执行程序  ps -f -p 进程号 # ps -f -p 5014 UID        PID  PPID  C STIME T
庞小明
2018/07/06
4K1
如何解决windows系统和linux系统中端口被占用的问题
这篇文章主要介绍了如何解决windows系统和linux系统中端口被占用的问题的相关资料,需要的朋友可以参考下
习惯说一说
2019/07/02
1.2K0
windows / linux系统中,端口被占用解决方法
一、在windows操作系统中,查询端口占用和清除端口占用的程序 提升权限后用:netstat -b 或用 1、查询端口占用的进程ID          点击"开始"-->"运行",输入"cmd"后点击确定按钮,进入DOS窗口,接下来分别运行以下命令: netstat -a -n  各个端口占用 netstat -ano   各个端口占用和进程PID          netstat -aon | findstr "80"      C:\Users\admin>netstat -aon|find
流柯
2018/08/30
2.5K0
MySQL之infobright安装步骤
我这里是将文件解压到了/usr/local/目录下面,如果有其他目录,则可以使用其他目录进行解压,解压后的文件如下:
AsiaYe
2019/11/06
1.6K0
制作一个只显示特定类别的导航栏
很多博客的导航栏是显示特定的分类的,如果你也想这样做,你可以添加下面这行代码和按照你自己的想法去样式化它。
Denis
2023/04/13
1K0
IEE数据库安装向导
# ./postconfig.sh(第一次运行postconfig.sh,更改IEE数据库的数据目录)
Alfred Zhao
2019/05/24
8090
IEE修改最大连接数
# vi /etc/my-ib.cnf  加入配置max_connections = 300
Alfred Zhao
2022/05/06
1.8K0
Jekyll x Liquid 控制文章列表只显示特定类别的Post
这个也很简单, 只需要立一个 Flag循环判断是否含有这个 Tag 就行 o(
szhshp
2022/08/15
5330
CentOS7上使用bind9搭建DNS主从服务器
   Linux中通常使用bind来实现DNS服务器的架设,bind软件由isc(https://www.isc.org/downloads/bind/)维护。在yum仓库中可以找到软件,配置好yum源,直接使用命令yum install bind就可以安装。当前bind的稳定版本为bind9,bind的服务名称为named,监听的端口为53号端口。bind的主要配置文件为/etc/named.conf,此文件主要用于配置区域,并指定区域数据库文件名称。区域数据库文件通常保存于/var/named/目录下,用于定义区域的资源类型。
三杯水Plus
2018/11/14
4.8K0
使用C++ Builder 6编译产生错误
作者:Gandalf1024 链接:https://www.jianshu.com/p/f42d045d5014 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
战神伽罗
2019/07/24
1.2K0
jupyter notebook解决500:Internal Server Error
如果中间像我一样报这个错误: ImportError: cannot import name 'secure_write'
生信编程日常
2020/12/08
7.7K0
【leetcode】43.1~n整数中1出现的次数
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
海盗船长
2020/08/27
1.1K0
爆肝代码两个月,我发现了北京房价的“小秘密”
此时一个对信息进行获取、存储、搜索、使用的系统就诞生了,我称其为个人结构化数据中心。
何时夕
2022/09/21
5590
【Rust日报】2020-09-16 - Rust 2021 规划
详情请见-rust blog:https://blog.rust-lang.org/2020/09/03/Planning-2021-Roadmap.html
MikeLoveRust
2020/09/23
7160
SpringBoot异步任务记录
简介 突发奇想,就想玩一下异步任务,记得之前项目有个场景需要使用异步执行,但是异步调用没有成功,后来采用了多线程去执行,今天就系统的学习下异步执行任务。记录一下 有时候在项目中,当访问其他人的接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能够并行执行, 我们可以使用多线程来并行的处理任务,也可以使用 spring 提供的异步处理方式 @Async 。 在异步处理的方法上添加注解 @Async ,就会启动一个新的线程去执行。 Spring 通过任务执行器 TaskExecutor ,来实现多线程
框架师
2021/08/05
6480
博科300 光纤交换机的配置
二、基本配置 1、配置IP、修改用户密码 a.新的光纤交换机默认ip为:10.77.77.77,需直连配置ip
全栈程序员站长
2022/08/26
2.9K0
博科300 光纤交换机的配置
使用普通用户替代root来管理IEE
环境:RHEL 6.4 + IEE 4.0.6 需求:IEE数据库之前是使用root用户部署和管理的,现在安全加固,将数据库交给普通用户iee来管理。
Alfred Zhao
2022/05/06
5290
python里使用vars()返回当前局部作用域的所有成员函数和成员变量
print("the %(book)s book contains more than %(scripts)s scripts" % vars())
用户7886150
2021/01/24
1.3K0
时间序列分解和异常检测方法应用案例
我们最近有一个很棒的机会与一位伟大的客户合作,要求Business Science构建一个适合他们需求的开源异常检测算法。业务目标是准确地检测各种营销数据的异常情况,这些数据包括跨多个客户和Web源跨越数千个时间序列的网站操作和营销反馈。输入anomalize:一个整洁的异常检测算法,该算法基于时间(建立在之上tibbletime)并可从一个到多个时间序列进行扩展!我们非常高兴能够为其他人提供这个开源R软件包以使其受益。在这篇文章中,我们将概述anomalize它的作用和方式。
拓端
2020/08/02
1.5K0
相关推荐
如何根据Excel某列数据为依据分成一个新的工作表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档