首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL Server与GROUP BY连接

SQL Server与GROUP BY连接
EN

Stack Overflow用户
提问于 2018-06-07 23:26:25
回答 3查看 60关注 0票数 0

假设我有这个表:

代码语言:javascript
复制
a   b   c
-----------
1   a   d
2   a   d
3   b   d
4   b   d
5   c   e
6   c   e

有没有一种方法可以让我按b和c分组,并得到一个串联的值来匹配a?

如下所示:

代码语言:javascript
复制
a   b   c
-----------
1,2 a   d
3,3 b   d
5,6 c   e

我可以通过使用GROUP by获得一个a:

代码语言:javascript
复制
SELECT MAX(a) AS a, b, c 
FROM mytable 
GROUP BY b, c

但这不是我要找的..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-07 23:40:27

这不是一个简单的素材连接吗?

代码语言:javascript
复制
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:

代码语言:javascript
复制
SELECT  STRING_AGG(CAST(ID AS nvarchar(50)), ', '),
        ONE,
        TWO
FROM @MYTAB
GROUP BY ONE, TWO

输出:

代码语言:javascript
复制
AGG     ONE TWO
---------------
1, 2    a   d
3, 4    b   d
5, 6    c   e
票数 2
EN

Stack Overflow用户

发布于 2018-06-07 23:43:24

这应该可以解决你的问题

代码语言:javascript
复制
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 
票数 1
EN

Stack Overflow用户

发布于 2018-06-07 23:50:33

Stuff是我同意的最好的解决方案。

只是为了给你另一种选择,你也可以不需要任何东西就能做到

代码语言:javascript
复制
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 

这将给你带来与材料相同的结果,但在过程中要复杂得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50745013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档