[英]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.