查询学生中重名的名字,人数和分布在几个系中,并按重名人数降序排列sqlserver
时间: 2024-03-21 21:40:23 浏览: 19
好的,以下是可以用于 SQL Server 数据库的 SQL 查询语句:
```sql
SELECT name, COUNT(*) AS count, GROUP_CONCAT(department) AS departments
FROM (
SELECT name, department, COUNT(*) AS cnt
FROM students
GROUP BY name, department
HAVING cnt > 1
) AS t
GROUP BY name
ORDER BY count DESC;
```
这个查询语句中,我们首先在 `students` 表格中分组统计每个名字在每个系中出现的次数,并且筛选出出现次数大于 1 的记录。然后,我们再次分组,统计每个名字的总出现次数以及它们出现的系,并将系名字用逗号拼接成一个字符串。最后,我们按照总出现次数降序排列结果。
需要注意的是,这个查询语句使用了 MySQL 中的 `GROUP_CONCAT` 函数,如果您是在 SQL Server 中使用,需要将它替换成 `STRING_AGG` 函数。此外,如果您的表格中有可能存在重名但是不同姓的情况,需要在 `SELECT` 和 `GROUP BY` 语句中同时考虑到名字和姓氏。
相关问题
sql server查询学生中重名的名字、人数和所分布的系,并按重名人数降序排列
以下是SQL Server查询学生中重名的名字、人数和所分布的系,并按照重名人数降序排列的SQL语句示例:
```sql
SELECT name, COUNT(*) as count, department
FROM students
GROUP BY name, department
HAVING COUNT(*) > 1
ORDER BY COUNT(*) DESC;
```
解释一下这个语句:
1. `SELECT name, COUNT(*) as count, department`:选择查询结果的三个字段,分别是姓名、人数和所在系。
2. `FROM students`:从学生表中查询。
3. `GROUP BY name, department`:按照姓名和所在系进行分组。
4. `HAVING COUNT(*) > 1`:筛选出至少有两个人重名的分组。
5. `ORDER BY COUNT(*) DESC`:按照重名人数降序排列。
注意,在实际应用中,可能需要根据具体情况修改表名、字段名和筛选条件等。
在上述条件下给出函数输入人名并调用search函数查询重名人数
好的,下面是调用 `search` 函数查询重名人数的示例代码:
```c
#include <stdio.h>
#include <string.h>
struct person {
char name[20];
int age;
char gender;
int is_valid;
};
int search(struct person p[], int n, char *name);
int main() {
struct person p[5] = {
{"Alice", 20, 'F', 1},
{"Bob", 22, 'M', 1},
{"Charlie", 25, 'M', 0},
{"Alice", 30, 'F', 1},
{"David", 28, 'M', 1},
};
char name[20];
printf("请输入要查询的姓名:");
scanf("%s", name);
int count = search(p, 5, name);
printf("%s 的重名人数为 %d\n", name, count);
return 0;
}
```
该示例代码定义了一个 `person` 结构体,包含了姓名、年龄、性别、是否为正确的公民等信息。在 `main` 函数中,我们定义了一个包含 5 个元素的 `person` 数组 `p`,并初始化了其中的元素。然后,我们通过 `scanf` 函数输入要查询的姓名 `name`,并调用 `search` 函数查询重名人数。最后,我们输出查询结果。
需要注意的是,这里假定输入的姓名不超过 20 个字符。如果需要支持更长的姓名,需要根据实际情况修改代码。