首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用特殊字符SQL Server对行进行协调和分隔

用特殊字符SQL Server对行进行协调和分隔
EN

Stack Overflow用户
提问于 2015-03-04 00:07:05
回答 1查看 38关注 0票数 0

我有下表,排序。

代码语言:javascript
运行
复制
ID    Value     Amount
A       2        10.00
A       3         4.25 
B       6         2.01
B       7         5.00 
B       9         9.00
B       11        4.25
C       8         10.00
C       6         4.00

我怎样才能得到:

代码语言:javascript
运行
复制
ID    Col1           Col2
A    [2-3]          [10.00-4.25]
B    [6-7],[9-11]   [2.01-5.00], [9.00-4.25]
C    [8-6]          [10.00-4.00]  

我知道,如果我只用逗号分隔,这可以与FOR路径一起使用,但我不知道如何只为一对值插入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-04 00:35:28

您可以使用ROW_NUMBER按两个对它们进行分组。其想法是先将行与-连接起来,然后再由,将它们连接起来。

代码语言:javascript
运行
复制
;WITH CteGrouping AS(
    SELECT *,
        RN = (ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Value) + 1) / 2
    FROM SampleData
)
,CteDash AS(
    SELECT
        ID,
        Col1 = STUFF((
            SELECT '-' + CONVERT(VARCHAR(10), Value)
            FROM CteGrouping t2
            WHERE 
                t2.ID = t1.ID
                AND t2.RN = t1.RN
            FOR XML PATH('')
        ),1 , 1, ''),
        Col2 = STUFF((
            SELECT '-' + CONVERT(VARCHAR(10), Amount)
            FROM CteGrouping t2
            WHERE 
                t2.ID = t1.ID
                AND t2.RN = t1.RN
            FOR XML PATH('')
        ),1, 1, '')
    FROM CteGrouping t1
    GROUP BY t1.ID, t1.RN
)
,CteBracket AS(
    SELECT
        ID,
        Col1 = STUFF((
            SELECT ',' + '[' + Col1 + ']'
            FROM CteDash t2
            WHERE 
                t2.ID = t1.ID
            FOR XML PATH('')
        ),1 , 1, ''),
        Col2 = STUFF((
            SELECT ',' + '[' + Col2 + ']'
            FROM CteDash t2
            WHERE 
                t2.ID = t1.ID
            FOR XML PATH('')
        ),1, 1, '')
    FROM CteDash t1
    GROUP BY t1.ID
)
SELECT * FROM CteBracket

结果

代码语言:javascript
运行
复制
| ID |         COL1 |                    COL2 |
|----|--------------|-------------------------|
|  A |        [2-3] |            [10.00-4.25] |
|  B | [6-7],[9-11] | [2.01-5.00],[9.00-4.25] |
|  C |        [6-8] |            [4.00-10.00] |

SQL FIDDDLE

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

https://stackoverflow.com/questions/28844428

复制
相关文章

相似问题

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