需要列出学生表中各个特殊字符的计数

时间:2017-09-06 18:29:14

标签: sql sql-server

我有一张这样的表:

studentname    marks
B@lu            20
T)m             100
J#hn            45
Tim*@           20

studentname列的输出应列出特殊字符数( @,),),#,*

Type    count
@        2
)        1
#        1
*        1

所以基本上我想计算这些字符在表格中重复的次数,然后在另一张桌子上显示。

特殊字符列表: - !#%& +,。/ :;< => @` {|}〜“()* \ _ \ _ ^ \?[] \''

3 个答案:

答案 0 :(得分:1)

以下内容应该这样做。

DECLARE @YourTable TABLE(StudentName VARCHAR(50) NOT NULL );

INSERT @YourTable
       (StudentName)
VALUES ('B@lu'),
       ('T)m'),
       ('J#hn'),
       ('Tim*@'),
       ('-!#%&+,./:;<=>@`{|}~"()*_^?[]\''');

SELECT letter,
       COUNT(*) AS [count]
FROM   @YourTable
       JOIN master..spt_values
         ON Type = 'P'
            AND number BETWEEN 1 AND LEN(studentname)
       CROSS APPLY (SELECT SUBSTRING(StudentName, number, 1)) CA(letter)
WHERE  letter LIKE '[!-#%-/:;-?@[-`{-~]' COLLATE Latin1_General_BIN2
GROUP  BY letter
ORDER  BY [count] DESC 

答案 1 :(得分:1)

看看下面的内容......

IF OBJECT_ID('tempdb..#SpecialCharacter', 'U') IS NOT NULL 
DROP TABLE #SpecialCharacter;

CREATE TABLE #SpecialCharacter (
    SpecialChar CHAR(1) NOT NULL 
    );
INSERT #SpecialCharacter (SpecialChar) VALUES
    ('-'), ('!'), ('#'), ('%'), ('&'), ('+'), (','), 
    ('.'), ('/'), (':'), (';'), ('<'), ('='), ('>'), 
    ('@'), ('`'), ('{'), ('|'), ('}'), ('~'), ('"'), 
    ('('), (')'), ('*'), ('\'), ('_'), ('\'), ('^'), 
    ('\'), ('?'), ('['), (']'), ('\'), ('''');

IF OBJECT_ID('tempdb..#Student', 'U') IS NOT NULL 
DROP TABLE #Student;

CREATE TABLE #Student (
    StudentName  VARCHAR(20) NOT NULL 
    );
INSERT #Student (StudentName) VALUES
    ('B@lu'),
    ('T)m%'),
    ('J#h_n'),
    ('Tim*@'),
    ('J@@@&&&oN');

--========================================================
SELECT 
    sc.SpecialChar,
    CharCount = SUM(cc.CharCount)
FROM 
    #SpecialCharacter sc
    JOIN #Student s
        ON s.StudentName LIKE '%' + sc.SpecialChar + '%' 
    CROSS APPLY ( VALUES (LEN(s.StudentName) - LEN(REPLACE(s.StudentName, sc.SpecialChar, '')) ) ) cc (CharCount)
GROUP BY
    sc.SpecialChar
HAVING 
    SUM(cc.CharCount) > 0;

结果...

SpecialChar CharCount
----------- -----------
#           1
%           1
&           3
)           1
*           1
@           5
_           1

答案 2 :(得分:0)

假设有一个表格,其中包含所有感兴趣的特殊字符TableSpecialChar

select a.char 'type', count(*) 'Count' from TableSpecialChar a
inner join TableStudent b on b.name like '%['+a.char+']%'
group by a.char