Удалить дублирование кода в запросе SQL - PullRequest
0 голосов
/ 16 мая 2018

Есть ли способ удалить несколько повторений: LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1) в следующем запросе?

SELECT 
    ISNULL(LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1), 'Total'), 
    Count([Id]) 
FROM [dbo].[Ids]
GROUP BY ROLLUP(LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1))
ORDER BY 
    GROUPING(LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1)), 
    COUNT([Id]) DESC,
    LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1)

Хотя у меня есть конкретный пример, я надеюсь найти общее решение этой проблемы.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Если вы делаете это по нескольким запросам, вы можете создать определяемую пользователем скалярную функцию

CREATE FUNCTION Patterniser(@ID varchar(100))  
RETURNS varchar(100)  
AS  
BEGIN  
   DECLARE @Patterned varchar(100)  
        @Patterned= LEFT(@ID, PATINDEX('%[0-9]%', @ID) - 1)
    RETURN @Patterned
END 

Затем вызывать dbo.Patterniser([Id]) везде, где вы хотите ее использовать

0 голосов
/ 16 мая 2018

Один метод использует подзапросы.Еще один CTE.Мне нравится третий способ, боковые соединения с использованием apply:

SELECT COALESCE(v.x, 'Total'), 
       Count(*) 
FROM [dbo].[Ids] i OUTER APPLY
     (VALUES (LEFT([Id], PATINDEX('%[0-9]%', [Id]) - 1) )
     ) v(x)
GROUP BY ROLLUP(v.x)
ORDER BY GROUPING(v.x), 2 DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...