使用SUBSTRING、CHARINDEX、LEN等函数,写一个sql server查询,不能使用string_split函数。在MeetItem20200119表中,JoinName列,MsterName列和MeetSummaryName列中有若干人员姓名且多个姓名之间用逗号隔开,统计这三列中每个名字的出现次数并把其在这三列的出现次数展示出来。
时间: 2024-03-27 11:39:58 浏览: 121
可以使用 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 生成一个数字表,用于拆分字符串。
阅读全文