GROUP BY 和SUBSTRING 的配合使用
时间: 2023-08-08 18:04:16 浏览: 256
GROUP BY 和 SUBSTRING 可以配合使用来对字符串类型的列进行分组统计。SUBSTRING 函数可以用来截取字符串的一部分,而 GROUP BY 则可以将结果按照指定的列进行分组。
例如,假设有一个表格包含一个名字列和一个年龄列,可以使用下面的 SQL 语句按照名字的前三个字符进行分组统计:
```
SELECT SUBSTRING(name, 1, 3) AS name_prefix, AVG(age) AS avg_age
FROM my_table
GROUP BY name_prefix;
```
这样就可以得到每个名字前三个字符相同的人的平均年龄。其中 SUBSTRING 函数的第一个参数表示要截取的字符串,第二个参数表示截取的起始位置,第三个参数表示截取的长度。在上面的例子中,SUBSTRING 函数截取了每个名字的前三个字符作为分组依据。
相关问题
使用SUBSTRING、CHARINDEX、LEN等函数,写一个sql server查询,不能使用string_split函数。在MeetItem20200119表中,JoinName列,MsterName列和MeetSummaryName列中有若干人员姓名且多个姓名之间用逗号隔开,统计这三列中每个名字的出现次数并把其在这三列的出现次数展示出来。
可以使用 SUBSTRING、CHARINDEX、LEN 等函数配合使用,编写 SQL 查询语句来实现该需求。具体实现方法如下:
```
SELECT Name, SUM(CASE WHEN JoinName LIKE '%'+Name+'%' THEN 1 ELSE 0 END) AS JoinNameCount,
SUM(CASE WHEN MsterName LIKE '%'+Name+'%' THEN 1 ELSE 0 END) AS MsterNameCount,
SUM(CASE WHEN MeetSummaryName LIKE '%'+Name+'%' THEN 1 ELSE 0 END) AS MeetSummaryNameCount
FROM (
SELECT SUBSTRING(','+JoinName+',', Number+1, CHARINDEX(',', ','+JoinName+',', Number+1)-Number-1) AS Name
FROM MeetItem20200119
CROSS JOIN master..spt_values
WHERE Type = 'P' AND Number < LEN(','+JoinName+',')-1
UNION ALL
SELECT SUBSTRING(','+MsterName+',', Number+1, CHARINDEX(',', ','+MsterName+',', Number+1)-Number-1) AS Name
FROM MeetItem20200119
CROSS JOIN master..spt_values
WHERE Type = 'P' AND Number < LEN(','+MsterName+',')-1
UNION ALL
SELECT SUBSTRING(','+MeetSummaryName+',', Number+1, CHARINDEX(',', ','+MeetSummaryName+',', Number+1)-Number-1) AS Name
FROM MeetItem20200119
CROSS JOIN master..spt_values
WHERE Type = 'P' AND Number < LEN(','+MeetSummaryName+',')-1
) AS Names
GROUP BY Name
```
上述 SQL 查询语句首先使用了三个 UNION ALL 子句,将 JoinName、MsterName 和 MeetSummaryName 中所有的姓名拆分成单个的姓名,生成一个 Name 的临时表。
然后使用了 SUM、CASE WHEN 等函数,将每个姓名在三列中出现的次数统计出来,并分别计算出在 JoinName、MsterName 和 MeetSummaryName 列中的出现次数。
最后使用 GROUP BY 子句,将姓名进行分组,将每个姓名的出现次数展示出来。
需要注意的是,由于没有使用 string_split 函数,因此需要使用 CROSS JOIN master..spt_values 生成一个数字表,用于拆分字符串。
使用SUBSTRING、CHARINDEX、LEN等函数,写一个sql server查询,不能使用string_split函数。在名为AKSW的数据库中有MeetItem20200119表,表中有JoinName列,MsterName列和MeetSummaryName列,这三列中有若干人员姓名且多个姓名之间用逗号隔开,统计这三列中每个名字的出现次数并把其在这三列的出现次数展示出来。
可以使用 SUBSTRING、CHARINDEX、LEN 等函数配合使用,编写 SQL 查询语句来实现该需求。具体实现方法如下:
```
SELECT Name, SUM(CASE WHEN JoinName LIKE '%'+Name+'%' THEN 1 ELSE 0 END) AS JoinNameCount,
SUM(CASE WHEN MsterName LIKE '%'+Name+'%' THEN 1 ELSE 0 END) AS MsterNameCount,
SUM(CASE WHEN MeetSummaryName LIKE '%'+Name+'%' THEN 1 ELSE 0 END) AS MeetSummaryNameCount
FROM (
SELECT SUBSTRING(','+JoinName+',', Number+1, CHARINDEX(',', ','+JoinName+',', Number+1)-Number-1) AS Name
FROM MeetItem20200119
CROSS JOIN master..spt_values
WHERE Type = 'P' AND Number < LEN(','+JoinName+',')-1
UNION ALL
SELECT SUBSTRING(','+MsterName+',', Number+1, CHARINDEX(',', ','+MsterName+',', Number+1)-Number-1) AS Name
FROM MeetItem20200119
CROSS JOIN master..spt_values
WHERE Type = 'P' AND Number < LEN(','+MsterName+',')-1
UNION ALL
SELECT SUBSTRING(','+MeetSummaryName+',', Number+1, CHARINDEX(',', ','+MeetSummaryName+',', Number+1)-Number-1) AS Name
FROM MeetItem20200119
CROSS JOIN master..spt_values
WHERE Type = 'P' AND Number < LEN(','+MeetSummaryName+',')-1
) AS Names
GROUP BY Name
```
上述 SQL 查询语句首先使用了三个 UNION ALL 子句,将 JoinName、MsterName 和 MeetSummaryName 中所有的姓名拆分成单个的姓名,生成一个 Name 的临时表。
然后使用了 SUM、CASE WHEN 等函数,将每个姓名在三列中出现的次数统计出来,并分别计算出在 JoinName、MsterName 和 MeetSummaryName 列中的出现次数。
最后使用 GROUP BY 子句,将姓名进行分组,将每个姓名的出现次数展示出来。
需要注意的是,由于没有使用 string_split 函数,因此需要使用 CROSS JOIN master..spt_values 生成一个数字表,用于拆分字符串。另外,需要将 AKSW 替换成实际的数据库名。
阅读全文