[英]Create a comma seperated list in SQL Server but limit the list to 100 values
I have two tables, one table have ID's and another table have names.我有两张桌子,一张桌子有 ID,另一张桌子有名字。 For each name we have several ID's.
对于每个名称,我们都有几个 ID。 I have created a query to generate a comma separated list of ID'd for each name and below is the query used
我创建了一个查询来为每个名称生成一个逗号分隔的 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;
and its working fine并且它工作正常
now the problem is that the list of ID's is too big and sometimes we are getting 6000 ID back for a name.现在的问题是 ID 列表太大了,有时我们会为一个名字取回 6000 个 ID。 Can someone help me in creating a query which can limit the no of ID's which can come back in a single row.
有人可以帮助我创建一个查询,该查询可以限制可以在一行中返回的 ID 的数量。
From从
|Name|ID|</p>
|X |1,2,3,4,5........6000|
To到
|Name|ID|
|X |1,2,3,4,....100|
|X |101,........200|
.
.
.
|X |5901,.......6000|
Please help.请帮忙。
Thanks in advance提前致谢
Here is an option expanding on my comment above这是扩展我上面评论的选项
Note in this example I select 5 not 100 ... Just change / 5
to / 100
注意在这个例子中我选择 5 而不是 100 ...只需将
/ 5
更改为/ 100
Example例子
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
Returns退货
Name IDs
X 1, 2, 3, 4, 5
X 6, 7
Y 11, 12, 13, 14
What a pain!多么痛苦! Assuming that
name
is unique, you can do:假设该
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);
This leaves out the outer JOIN
to NameTable
because that is rather irrelevant to the problem.这省略了到
NameTable
的外部JOIN
,因为这与问题无关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.