繁体   English   中英

在 SQL Server 中创建一个逗号分隔的列表,但将列表限制为 100 个值

[英]Create a comma seperated list in SQL Server but limit the list to 100 values

我有两张桌子,一张桌子有 ID,另一张桌子有名字。 对于每个名称,我们都有几个 ID。 我创建了一个查询来为每个名称生成一个逗号分隔的 ID 列表,下面是使用的查询

 Select NameTable.name, c.* from (SELECT ID, name = 
    STUFF((SELECT ', ' + CONVERT(VARCHAR(12), name)
           FROM IDTable b 
           WHERE b.ID = a.ID 
          FOR XML PATH('')), 1, 2, '')
 FROM IDTable a
 GROUP BY ID) c Inner join NameTable on c.ID = NameTable.ID;

并且它工作正常

现在的问题是 ID 列表太大了,有时我们会为一个名字取回 6000 个 ID。 有人可以帮助我创建一个查询,该查询可以限制可以在一行中返回的 ID 的数量。

|Name|ID|</p>
|X   |1,2,3,4,5........6000|

|Name|ID|
|X   |1,2,3,4,....100|
|X   |101,........200|
.
.
.
|X   |5901,.......6000|

请帮忙。

提前致谢

这是扩展我上面评论的选项

注意在这个例子中我选择 5 而不是 100 ...只需将/ 5更改为/ 100

例子

Declare @YourTable Table ([Name] varchar(50),[ID] int)
Insert Into @YourTable Values 
 ('X',1)
,('X',2)
,('X',3)
,('X',4)
,('X',5)
,('X',6)
,('X',7)
,('Y',11)
,('Y',12)
,('Y',13)
,('Y',14)

;with cte as (
Select *
      ,Grp = (row_number() over (partition by name order by id) -1) / 5
  from @YourTable
) 
Select A.Name
      ,IDs =  stuff((Select ', ' + cast(ID as varchar(25)) 
                      From  cte B
                      Where B.Name = A.Name 
                        and B.grp = A.Grp
                      For XML Path('')), 1, 2, '')
 From  cte A
 Group By A.Name,A.Grp

退货

Name    IDs
X       1, 2, 3, 4, 5
X       6, 7
Y       11, 12, 13, 14

多么痛苦! 假设该name是唯一的,您可以执行以下操作:

SELECT ID,
       STUFF((SELECT ', ' + CONVERT(VARCHAR(12), name)
              FROM (SELECT i2.*,
                           ROW_NUMBER() OVER (ORDER BY name) as seqnum
                    FROM IDTable i2 
                    WHERE b.ID = a.ID 
                   ) i2
              WHERE seqnum >= cnt * 100 - 99 AND
                    seqnum < cnt * 100
              FOR XML PATH('')
             ), 1, 2, ''
            ) as name
FROM (SELECT id, COUNT(*) as cnt
      FROM IDTable i
      GROUP BY id
     ) i CROSS APPLY
     (SELECT ROW_NUMBER() OVER (ORDER BY NULL) as n
      FROM IDTable i2
     ) n
WHERE n.seqnum <= CEIL(cnt / 100.0);

这省略了到NameTable的外部JOIN ,因为这与问题无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM