[SQL] 각 그룹에 대해 특정 열에서 모든 문자열을 연결하는 방법
SQL각 그룹에 대해 특정 열에서 모든 문자열을 연결하는 방법
나는이 테이블이 있다고 가정 [표 1]
Name Mark
------- ------
ABC 10
DEF 10
GHI 10
JKL 20
MNO 20
PQR 30
어떤 레코드를 검색하는 내 SQL 문을해야한다고 다음과 같다 : ([표]에 의해 기). 나는 1, 2 열을 수행했지만 세 번째 열 수행하는 방법을 모르는 (같은 [표시]와 [이름] CONCAT를)
mark count names
---- ----- -----------
10 3 ABC,DEF,GHI
20 2 JKL,MNO
30 1 PQR
나는 마이크로 소프트 SQL을 사용하고 있습니다. 도와주세요. 감사
해결법
-
==============================
1.MS SQL 2005 이상합니다.
MS SQL 2005 이상합니다.
declare @t table([name] varchar(max), mark int) insert @t values ('ABC', 10), ('DEF', 10), ('GHI', 10), ('JKL', 20), ('MNO', 20), ('PQR', 30) select t.mark, COUNT(*) [count] ,STUFF(( select ',' + [name] from @t t1 where t1.mark = t.mark for xml path(''), type ).value('.', 'varchar(max)'), 1, 1, '') [values] from @t t group by t.mark
산출:
mark count values ----------- ----------- -------------- 10 3 ABC,DEF,GHI 20 2 JKL,MNO 30 1 PQR
-
==============================
2.여기에 성능 관련 답변입니다!
여기에 성능 관련 답변입니다!
http://jerrytech.blogspot.com/2010/04/tsql-concatenate-strings-1-2-3-and.html
큰 쿼리에서 XML 기능을 사용하면 성능 살인자입니다.
CTE를 사용하면 성능 슈퍼 스타이다.
링크를 확인,이 방법을 설명 할 것이다.
나는 그것이 더 달성하기 위해 일을 인정한다.
그러나 결과는 수백만 개의 행 이상 밀리 초입니다.
-
==============================
3.polishchuks 솔루션은 더 우아하다, 그러나 이것은 기본적으로 같은 것, 우리가 다르게 콤마 처리합니다.
polishchuks 솔루션은 더 우아하다, 그러나 이것은 기본적으로 같은 것, 우리가 다르게 콤마 처리합니다.
CREATE TABLE #Marks(Name nchar(3), Mark int) INSERT INTO #Marks SELECT 'ABC', 10 UNION ALL SELECT 'DEF', 10 UNION ALL SELECT 'GHI', 10 UNION ALL SELECT 'JKL', 20 UNION ALL SELECT 'MNO', 20 UNION ALL SELECT 'PQR', 30 SELECT mark, [count], CASE WHEN Len(Names) > 0 THEN LEFT(Names, LEN(Names) -1) ELSE '' END names FROM ( SELECT Mark, COUNT(Mark) AS [count], ( SELECT DISTINCT Name + ', ' FROM #Marks M1 WHERE M1.Mark = M2.Mark FOR XML PATH('') ) Names FROM #Marks M2 GROUP BY Mark ) M
-
==============================
4.T-SQL 프로그래밍, P : 느슨하게 Itzik 벤 웨이 코 뮤니시, 내부 마이크로 소프트 SQL 서버 2005을 기반으로. 215 :
T-SQL 프로그래밍, P : 느슨하게 Itzik 벤 웨이 코 뮤니시, 내부 마이크로 소프트 SQL 서버 2005을 기반으로. 215 :
IF OBJECT_ID('dbo.Table1') IS NOT NULL DROP TABLE dbo.Table1 ; GO CREATE TABLE dbo.Table1 ( Name VARCHAR(10), Mark INT ) ; INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'ABC', 10 ) ; INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'DEF', 10 ) ; INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'GHI', 10 ) ; INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'JKL', 20 ) ; INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'MNO', 20 ) ; INSERT INTO dbo.Table1 ( Name, Mark ) VALUES ( 'PQR', 30 ) ; WITH DelimitedNames AS ( SELECT Mark, T2.Count, ( SELECT Name + ',' AS [text()] FROM dbo.Table1 AS T1 WHERE T1.Mark = T2.Mark ORDER BY T1.Mark FOR XML PATH('')) AS Names FROM ( SELECT Mark, COUNT(*) AS Count FROM dbo.Table1 GROUP BY Mark ) AS T2 ) SELECT Mark, Count, LEFT(Names, LEN(NAMES) - 1) AS Names FROM DelimitedNames ;
from https://stackoverflow.com/questions/6579440/how-to-concatenate-all-strings-from-a-certain-column-for-each-group by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] PostgreSQL의 테이블 변수 (0) | 2020.07.03 |
---|---|
[SQL] 한 시스템에서 다른 시스템으로 SQL 서버 2008 R2 데이터베이스를 복사하는 방법 (0) | 2020.07.03 |
[SQL] 왜 내 왼쪽은 null을 반환하지에 가입한다? (0) | 2020.07.03 |
[SQL] 일부 단어 MySQL의 전체 텍스트 검색 (0) | 2020.07.03 |
[SQL] SQL Server 관리 Studio는 - 어떻게 테이블을 삭제하지 않고 필드 유형을 변경합니다 (0) | 2020.07.03 |