假设我有这个表:
a b c
-----------
1 a d
2 a d
3 b d
4 b d
5 c e
6 c e
有没有一种方法可以让我按b和c分组,并得到一个串联的值来匹配a?
如下所示:
a b c
-----------
1,2 a d
3,3 b d
5,6 c e
我可以通过使用GROUP by获得一个a:
SELECT MAX(a) AS a, b, c
FROM mytable
GROUP BY b, c
但这不是我要找的..。
发布于 2018-06-07 23:40:27
这不是一个简单的素材连接吗?
DECLARE @MYTAB TABLE (ID INT,
ONE NVARCHAR(1),
TWO NVARCHAR(1)
)
INSERT INTO @MYTAB VALUES
(1, 'a', 'd'),
(2, 'a', 'd'),
(3, 'b', 'd'),
(4, 'b', 'd'),
(5, 'c', 'e'),
(6, 'c', 'e')
SELECT STUFF(
(
SELECT N', '+CAST(ID AS NVARCHAR(50))
FROM @MYTAB T2
WHERE T2.ONE = T.ONE
AND T2.TWO = T.TWO FOR XML PATH(''), TYPE
).value('text()[1]', 'nvarchar(max)'), 1, 2, N'') [MY AGGREGATE],
ONE,
TWO
FROM @MYTAB T
GROUP BY T.ONE,
T.TWO;
SQL SERVER 2017:
SELECT STRING_AGG(CAST(ID AS nvarchar(50)), ', '),
ONE,
TWO
FROM @MYTAB
GROUP BY ONE, TWO
输出:
AGG ONE TWO
---------------
1, 2 a d
3, 4 b d
5, 6 c e
发布于 2018-06-07 23:43:24
这应该可以解决你的问题
create table #t
(
a char(1)
,b char(1)
,c char(1)
)
insert into #t
select '1','a','d' union all
select '2','a','d' union all
select '3','b','d' union all
select '4','b','d' union all
select '5','c','e' union all
select '6','c','e'
select stuff ((select ','+ a FROM #t T1 where T1.b = T.B and T1.c = T.c For XML PATH ('')) ,1,1,''),b,c
FROM #t T
group by b,c
发布于 2018-06-07 23:50:33
Stuff是我同意的最好的解决方案。
只是为了给你另一种选择,你也可以不需要任何东西就能做到
declare @t table (a int, b varchar(1), c varchar(1))
insert into @t values (1, 'a', 'd'), (2, 'a', 'd'), (3, 'b', 'd'), (4, 'b', 'd'), (5, 'c', 'e'), (6, 'c', 'e')
select left(temp.a, len(temp.a) - 1) as a,
temp.b,
temp.c
from ( select t.b,
t.c,
( select convert(varchar, t2.a) + ',' AS [text()]
from @t t2
where t2.b = t.b
and t2.c = t.c
For XML PATH ('')
) as a
from @t t
group by t.b, t.c
) temp
这将给你带来与材料相同的结果,但在过程中要复杂得多。
https://stackoverflow.com/questions/50745013
复制相似问题