loops - 如何检查字母表中所有字母的统计信息
问题描述
我正在使用strs
表格检查一些条件。我可以为字母表中的所有字母做到这一点。但这将是硬代码。你能告诉我如何概括检查过程吗?
我试图手动检查每个字母。
CREATE TABLE strs
(
str_ VARCHAR(20)
);
CREATE TABLE final_data
(
letter VARCHAR(20),
total int,
occurance int,
max_occurance int,
max_occurance_reached int
);
INSERT INTO strs(str_)
VALUES('aa'),
('aaaa'),
('aab'),
('abaaba'),
('bbbbb');
INSERT INTO final_data(letter,total,occurance,max_occurance,max_occurance_reached)
SELECT DISTINCT tb1.letter,tb2.Total,tb3.occurance,tb4.max_occurance,tb5.max_occurance_reached FROM
(SELECT 'a' AS letter FROM strs ) as tb1
LEFT JOIN (SELECT 'a' AS letter, SUM(LEN(str_)-LEN(REPLACE(str_,'a',''))) AS Total FROM strs) AS tb2
ON tb1.letter=tb2.letter
LEFT JOIN (SELECT 'a' AS letter ,COUNT(str_) AS occurance FROM strs WHERE CHARINDEX('a',str_)>0) AS tb3
ON tb2.letter=tb3.letter
LEFT JOIN (SELECT 'a' AS letter, MAX(LEN(str_)-LEN(REPLACE(str_,'a',''))) as max_occurance FROM strs) AS tb4
ON tb3.letter=tb4.letter
LEFT JOIN (SELECT 'a' AS letter ,count(str_) AS max_occurance_reached FROM strs WHERE (LEN(str_)-LEN(REPLACE(str_,'a',''))) in (SELECT MAX(LEN(str_)-LEN(REPLACE(str_,'a',''))) FROM strs)) AS tb5
ON tb4.letter=tb5.letter;
INSERT INTO final_data(letter,total,occurance,max_occurance,max_occurance_reached)
SELECT DISTINCT tb1.letter,tb2.Total,tb3.occurance,tb4.max_occurance,tb5.max_occurance_reached FROM
(SELECT 'b' AS letter FROM strs ) AS tb1
LEFT JOIN (SELECT 'b' AS letter, sum(LEN(str_)-LEN(REPLACE(str_,'b',''))) AS Total FROM strs) AS tb2
ON tb1.letter=tb2.letter
LEFT JOIN (SELECT 'b' AS letter ,count(str_) AS occurance FROM strs WHERE CHARINDEX('b',str_)>0) AS tb3
ON tb2.letter=tb3.letter
LEFT JOIN (SELECT 'b' AS letter, MAX(LEN(str_)-LEN(REPLACE(str_,'b',''))) AS max_occurance FROM strs) AS tb4
ON tb3.letter=tb4.letter
LEFT JOIN (SELECT 'b' AS letter ,count(str_) AS max_occurance_reached FROM strs WHERE (LEN(str_)-LEN(REPLACE(str_,'b','')))
in (SELECT MAX(LEN(str_)-LEN(REPLACE(str_,'b',''))) FROM strs)) as tb5
ON tb4.letter=tb5.letter;
SELECT letter,total,occurance,max_occurance,max_occurance_reached FROM final_data;
解决方案
您可以尝试使用以下代码
Declare @num tinyint, @alphabet char(1)
Declare @i int=0
While @i<26
Begin
Select @num = 97+@i
Select @alphabet = char(@num)
INSERT INTO final_data(letter,total,occurance,max_occurance,max_occurance_reached)
SELECT DISTINCT tb1.letter,tb2.Total,tb3.occurance,tb4.max_occurance,tb5.max_occurance_reached FROM
(SELECT @alphabet AS letter FROM strs ) as tb1
LEFT JOIN (SELECT @alphabet AS letter, SUM(LEN(str_)-LEN(REPLACE(str_,@alphabet,''))) AS Total FROM strs) AS tb2
ON tb1.letter=tb2.letter
LEFT JOIN (SELECT @alphabet AS letter ,COUNT(str_) AS occurance FROM strs WHERE CHARINDEX(@alphabet,str_)>0) AS tb3
ON tb2.letter=tb3.letter
LEFT JOIN (SELECT @alphabet AS letter, MAX(LEN(str_)-LEN(REPLACE(str_,@alphabet,''))) as max_occurance FROM strs) AS tb4
ON tb3.letter=tb4.letter
LEFT JOIN (SELECT @alphabet AS letter ,count(str_) AS max_occurance_reached FROM strs WHERE (LEN(str_)-LEN(REPLACE(str_,@alphabet,''))) in (SELECT MAX(LEN(str_)-LEN(REPLACE(str_,@alphabet,''))) FROM strs)) AS tb5
ON tb4.letter=tb5.letter;
set @i=@i+1
End
SELECT letter,total,occurance,max_occurance,max_occurance_reached FROM final_data;
推荐阅读
- javascript - 如何捕获从异步函数重新抛出的错误?
- python-3.x - 如何使用 lxml 访问 xml 字段?
- operating-system - Raspberry Pi 不会删除 OpenElec 和 Kodi
- openstreetmap - 无法正确合并 osm.pbf 文件
- android - 颤动本地通知:频道ID是什么?
- eclipse - 如何获取使用 Maven (MVN) 3.2.3 作为 Maven 嵌入式版本的 Eclipse 版本
- json - Apple Search Ads API 广告组出价
- python - AttributeError:“SparkSession”对象没有属性“时间”
- javascript - 如何使 NavBar 中的 onClick 事件做出反应?
- google-cloud-firestore - 有什么方法可以验证 Firestore 规则中的数组