首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元格中具有不同范围的Sql Server中的最小最大逗号分隔范围

单元格中具有不同范围的Sql Server中的最小最大逗号分隔范围
EN

Stack Overflow用户
提问于 2016-04-26 13:31:05
回答 1查看 74关注 0票数 0

我写了这个查询,使用Stuff来生成范围,但由于输入时间分组,如果相同的时间进入不同的范围,则无法找到范围的最小最大值,因此存在问题

代码语言:javascript
复制
SELECT DISTINCT ST2.Center_Code
    ,STUFF((
            SELECT ' , ' + ST1.Ranges
            FROM (
                SELECT Center_Code
                    ,CAST(MIN(CONVERT(BIGINT, Starting_No)) AS VARCHAR(9)) + '-' + CAST(MAX(CONVERT(BIGINT, Starting_No)) AS VARCHAR(9)) Ranges
                FROM AwardSheet_Record
                GROUP BY Center_Code
                    ,LEFT(Despatch_Time, 8)
                ) ST1
            WHERE ST1.Center_Code = ST2.Center_Code
            ORDER BY ST1.Center_Code
            FOR XML PATH('')
            ), 1, 2, '') Center_Range
FROM AwardSheet_Record ST2
WHERE ST2.Center_Code IS NOT NULL

表中的记录如下所示

代码语言:javascript
复制
CenterCode   starting    time
  123           1       2:30
  123           2       2:30
  123           3       2:30
  14            6       2:33
  14            7       2:33
  14            8       2:33
  123           9       2:35
  123           10      2:35
  14            11      2:38
  14            12      2:38
  14            13      2:38

所需范围为中心123 1-2、8-10和中心14 6-8、11-13

EN

回答 1

Stack Overflow用户

发布于 2016-04-26 18:47:50

我会分阶段来做:

代码语言:javascript
复制
With AwardSheet_Record As (
    Select CenterCode, starting, cast(Time as Time) As Time
    From (Values 
        ((123 ),(1 ),('2:30')),
        ((123 ),(2 ),('2:30')),
        ((123 ),(3 ),('2:30')),
        ((14  ),(6 ),('2:33')),
        ((14  ),(7 ),('2:33')),
        ((14  ),(8 ),('2:33')),
        ((123 ),(9 ),('2:35')),
        ((123 ),(10),('2:35')),
        ((14  ),(11),('2:38')),
        ((14  ),(12),('2:38')),
        ((14  ),(13),('2:38'))
    ) a (CenterCode, starting, Time)
), AwardSheet_Intervals As (
    Select CenterCode, Time, Cast(Min(starting) As Varchar) + ' - ' + Cast(Max(starting) As Varchar) As Interval
    From AwardSheet_Record
    Group By CenterCode, Time
)
Select CenterCode,
  STUFF((
    Select ', ' + Interval
    From AwardSheet_Intervals
    Where CenterCode = Ref.CenterCode --< Apply GROUP BY filtering here
    Order By Time
    For XML PATH (''), TYPE
  ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') As [Range] --< XML trick to combine values in a comma-separated string
From AwardSheet_Intervals Ref
Group By CenterCode;

代码语言:javascript
复制
CenterCode  Range
----------  --------------
        14  6 - 8, 11 - 13
       123  1 - 3, 9 - 10
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36855992

复制
相关文章

相似问题

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