我想让我的结果在范围内(e:xx - xx),而不是列出每个数字(例如:XX,XX,XX,XX)
这是我用于示例的表格
表格
Doc Pages
ABC 1
ABC 2
ABC 3
ABC 4
ABC 5
ABC 6
ABC 7
TEST 30
TEST 31
TEST 35
TEST 36
TEST 37
TEST 38
TEST 39
TEST 41
EFG 50
EFG 51
EFG 52
EFG 55
这是我用来获取结果的功能
功能
CREATE FUNCTION [dbo].[GetPagebyDoc]
(
@Doc varchar(50)
)
RETURNS varchar(max)
AS
BEGIN
declare @output varchar(max)
select @output = COALESCE(@output + ', ',' ') + pages
from TABLE
where doc = @doc
return @output
END
GO
SELECT doc, dbo.GetPagebyDoc(doc)
FROM TABLE
GROUP BY doc
GO
这是我的功能
的结果结果
Doc Pages
ABC 1, 2, 3, 4, 5, 6, 7
TEST 30, 31, 35, 36, 37, 38, 39, 41
EFG 50, 51, 52, 55
我需要帮助才能让我的结果看起来像这样。
我想要我的结果
Doc Pages
ABC 1 - 7
TEST 30 - 31, 35 - 39, 41
EFG 50 - 52, 55
答案 0 :(得分:0)
您正在尝试识别Islands and Gaps in Sequential Numbers,因此使用链接页面上的示例找到一个解决方案:
SELECT t1.Doc, t1.Pages as startOfGroup, MIN(t2.Pages) as endOfGroup
FROM (SELECT Doc, Pages FROM Table1 tbl1
WHERE NOT EXISTS(SELECT * FROM Table1 tbl2
WHERE tbl1.Pages - tbl2.Pages = 1)) t1
INNER JOIN (SELECT Doc, Pages FROM Table1 tbl1
WHERE NOT EXISTS(SELECT * FROM Table1 tbl2
WHERE tbl2.Pages - tbl1.Pages = 1)) t2
ON t1.Pages <= t2.Pages
GROUP BY t1.Doc, t1.Pages
为了让结果看起来像你描述的那样,我会得到表示/应用层来重新格式化输出。