限制字符串聚合查询中的元素数量
Limit Number of elements in a string aggregation query
我有以下 table 和使用 XML 的字符串聚合:
CREATE TABLE TestTable ([ID] INT, [Name] CHAR(1))
INSERT INTO TestTable ([ID],[Name]) VALUES (1,'A')
INSERT INTO TestTable ([ID],[Name]) VALUES (2,'B')
INSERT INTO TestTable ([ID],[Name]) VALUES (3,'C')
INSERT INTO TestTable ([ID],[Name]) VALUES (1,'D')
INSERT INTO TestTable ([ID],[Name]) VALUES (1,'E')
INSERT INTO TestTable ([ID],[Name]) VALUES (2,'F')
INSERT INTO TestTable ([ID],[Name]) VALUES (3,'G')
INSERT INTO TestTable ([ID],[Name]) VALUES (4,'H')
SELECT
[ID],
STUFF((
SELECT ' ' + [Name]
FROM TestTable
WHERE (ID = Results.ID)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
,1,2,'') AS Names
FROM TestTable Results
GROUP BY ID
我得到低于结果
ID Names
1 A D E
2 B F
3 C G
4 H
但是我要求将名称的数量限制为两个,如果超过两个,它应该拆分到下一行,如下所示。这里对于 ID=1,有 3 个名称,因此第 3 个名称拆分到下一行。我怎样才能达到这个要求
ID Names
1 A D
1 E
2 B F
3 C G
4 H
谢谢
听起来您想要条件聚合,每行最多 name
列。您可以使用 row_number()
和一些算术来做到这一点:
select id,
max(case when seqnum % 2 = 1 then name end) as name1,
max(case when seqnum % 2 = 0 then name end) as name2
from (select t.*,
row_number() over (partition by id order by name) as seqnum
from testtable t
) t
group by id, ceiling(seqnum / 2.0)
order by id, min(seqnum);
Here 是一个 db<>fiddle.
请注意,您可以将它们连接成一列。我看不出这样做的理由,因为您知道每行的最大数量。
我有以下 table 和使用 XML 的字符串聚合:
CREATE TABLE TestTable ([ID] INT, [Name] CHAR(1))
INSERT INTO TestTable ([ID],[Name]) VALUES (1,'A')
INSERT INTO TestTable ([ID],[Name]) VALUES (2,'B')
INSERT INTO TestTable ([ID],[Name]) VALUES (3,'C')
INSERT INTO TestTable ([ID],[Name]) VALUES (1,'D')
INSERT INTO TestTable ([ID],[Name]) VALUES (1,'E')
INSERT INTO TestTable ([ID],[Name]) VALUES (2,'F')
INSERT INTO TestTable ([ID],[Name]) VALUES (3,'G')
INSERT INTO TestTable ([ID],[Name]) VALUES (4,'H')
SELECT
[ID],
STUFF((
SELECT ' ' + [Name]
FROM TestTable
WHERE (ID = Results.ID)
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
,1,2,'') AS Names
FROM TestTable Results
GROUP BY ID
我得到低于结果
ID Names
1 A D E
2 B F
3 C G
4 H
但是我要求将名称的数量限制为两个,如果超过两个,它应该拆分到下一行,如下所示。这里对于 ID=1,有 3 个名称,因此第 3 个名称拆分到下一行。我怎样才能达到这个要求
ID Names
1 A D
1 E
2 B F
3 C G
4 H
谢谢
听起来您想要条件聚合,每行最多 name
列。您可以使用 row_number()
和一些算术来做到这一点:
select id,
max(case when seqnum % 2 = 1 then name end) as name1,
max(case when seqnum % 2 = 0 then name end) as name2
from (select t.*,
row_number() over (partition by id order by name) as seqnum
from testtable t
) t
group by id, ceiling(seqnum / 2.0)
order by id, min(seqnum);
Here 是一个 db<>fiddle.
请注意,您可以将它们连接成一列。我看不出这样做的理由,因为您知道每行的最大数量。