删除 SQL 查询中的代码重复
Remove code-duplication in SQL query
有没有办法删除多次重复:
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)
尽管我有一个具体的例子,但我还是希望找到一个通用的解决方案来解决这个问题。
一种方法使用子查询。另一个 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
如果您跨多个查询执行此操作,您可以创建 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])
有没有办法删除多次重复:
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)
尽管我有一个具体的例子,但我还是希望找到一个通用的解决方案来解决这个问题。
一种方法使用子查询。另一个 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
如果您跨多个查询执行此操作,您可以创建 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])