T-SQL находит строку из восьми символов, которая не содержит пробелов и хотя бы 1 число из строки, и исключает ее - PullRequest
2 голосов
/ 14 марта 2012

Проблема в том, что у нас есть много разных сообщений об ошибках, которые создаются и хранятся в таблице sql в сообщении об ошибке. Может иметь место проект длиной 8 символов, который будет содержать хотя бы 1 номер, является буквенно-цифровым и без пробелов.для каждого сообщения об ошибке номер проекта может не совпадать.

например,

'error found processing project: abcd12sf no funding is set'
'error found processing project: qd451srf no funding is set'
'error project 2344ddrf has no approver'

Мы хотим иметь возможность подсчитать количество определенных ошибок, поэтому нам нужно убрать номер проекта извывод

таким образом

'error found processing project: no funding is set' , 2 occurances
'error project has no approver' , 1 occurance

Любая помощь с благодарностью

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Начните с создания функции, которая возвращает номер проекта. Я сделал это, найдя первое целое число, а затем позицию пробела после него, а затем отсчитав 8 символов, у вас есть начальная и конечная позиции.

CREATE FUNCTION GetProjectNumber(@FullErrorMessage varchar(100))

RETURNS CHAR(8)

AS 

BEGIN

    DECLARE @ProjectNumber CHAR(8)

    SET @ProjectNumber = (
                                    SELECT  
                                    SUBSTRING(@FullErrorMessage, CHARINDEX(' ',@FullErrorMessage,PATINDEX('%[0-9]%',@FullErrorMessage))-8,8)
                                )

    RETURN @ProjectNumber
END

Измените в своей таблице вычисляемый столбец с именем ProjectNumber. Это создание, которое я сделал для тестирования, но вы должны понять.

CREATE TABLE T_Errors(
ID int IDENTITY(1,1),
ErrorMessage varchar(1024),
ProjectNumber AS (dbo.GetProjectNumber(ErrorMessage))
CONSTRAINT PK_T_Errors PRIMARY KEY CLUSTERED(ID))

Теперь у вас есть номер проекта в отдельном столбце, с которым легко играть.

SELECT 
CleanErrorMessage = REPLACE(ErrorMessage,ProjectNumber,''),
COUNT(*) As ErrorCount
FROM T_Errors
GROUP BY REPLACE(ErrorMessage,ProjectNumber,'')
0 голосов
/ 14 марта 2012

Если у вас есть список допустимых номеров проекта, вы можете сделать что-то вроде этого.

Образцы таблиц и данных:

declare @Project table
(
  ProjectNumber char(8)
)

insert into @Project values
('abcd12sf'),
('qd451srf'),
('2344ddrf')

declare @Error table
(
  Error varchar(100)
)

insert into @Error values
('error found processing project: abcd12sf no funding is set'),
('error found processing project: qd451srf no funding is set'),
('error project 2344ddrf has no approver')

Запрос:

select P.Error,
       count(*) as ErrorCount
from @Error as E
  cross apply
    (
      select replace(E.Error, P.ProjectNumber, '') as Error
      from @Project as P
      where E.Error like '%'+P.ProjectNumber+'%'
    ) as P
group by P.Error

Результат:

Error                                               ErrorCount
--------------------------------------------------  ----------
error found processing project:  no funding is set  2
error project  has no approver                      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...