删除SQL查询中的代码重复

时间:2018-05-16 12:01:06

标签: sql sql-server syntax code-duplication

有没有办法删除多次重复: 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 :(得分:3)

一种方法使用子查询。另一个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

答案 1 :(得分:2)

如果您在多个查询中执行此操作,则可以创建user defined scalar function

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])