首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL将数字列表转换为一列中的范围

SQL将数字列表转换为一列中的范围
EN

Stack Overflow用户
提问于 2017-02-15 16:14:36
回答 2查看 834关注 0票数 1

如果我在一个表中有一个范围列表,例如

代码语言:javascript
复制
ID    Number
1       4
1       5
1       6
1       7
1       9

有没有办法用SQL把'4-7,9‘变成一个varchar列?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-02-15 16:53:42

您可以使用ROW_NUMBERXML PATH

代码语言:javascript
复制
DECLARE @Mock TABLE (Id INT, Number INT)
INSERT INTO @Mock        
VALUES  
(1, 4),
(1, 5),
(1, 6),
(1, 7),
(1, 9)   

;WITH CTE
AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY Number) AS  RowId,*
    FROM @Mock
)

SELECT  
    STUFF(
    (
        SELECT          
            ',' + CAST(MIN(C.Number) AS VARCHAR(10)) + CASE WHEN MIN(C.Number) = MAX(C.Number) THEN '' ELSE '-' + CAST(MAX(C.Number) AS VARCHAR(10)) END
        FROM
            CTE C
        GROUP BY            
            C.Number - C.RowId
        FOR XML PATH ('')

    ), 1, 1, '') Result

输出:4-7,9

票数 1
EN

Stack Overflow用户

发布于 2017-02-15 16:58:03

考虑到您有另一个方法来查找范围的顺序

代码语言:javascript
复制
;WITH cte
     AS (SELECT *,
                Sum(CASE
                      WHEN number = prev_lag + 1 THEN 0
                      ELSE 1
                    END)
                  OVER(
                    ORDER BY iden_col) AS grp
         FROM   (SELECT *,
                        Lag(number)
                          OVER(
                            partition BY [ID]
                            ORDER BY iden_col) AS prev_lag
                 FROM   Yourtable)a),
     intr
     AS (SELECT id,
                CASE
                  WHEN Min(number) = Max(number) THEN Cast(Min(number) AS VARCHAR(50))
                  ELSE Concat(Min(number), '-', Max(number))
                END AS intr_res
         FROM   cte
         GROUP  BY id,
                   grp)
SELECT DISTINCT Id,
                Stuff(concat_col, 1, 1, '')
FROM   intr a
       CROSS apply (SELECT ',' + intr_res
                    FROM   intr b
                    WHERE  a.ID = b.ID
                    FOR xml path('')) cs (concat_col) 

  • Demo
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42243892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档