[SQL] SQL Server의 CONCAT 그룹 [중복]
SQLSQL Server의 CONCAT 그룹 [중복]
이 같은 테이블이있는 경우 :
+------------+
| Id | Value |
+------------+
| 1 | 'A' |
|------------|
| 1 | 'B' |
|------------|
| 2 | 'C' |
+------------+
어떻게이 같은 결과 집합을 얻을 수 있습니다 :
+------------+
| Id | Value |
+------------+
| 1 | 'AB' |
|------------|
| 2 | 'C' |
+------------+
나는이 GROUP_CONCAT를 사용하여 MySQL의에서 할 정말 쉽게 알지만, MSSQL 2005 년에 그것을 할 수 있어야합니다
감사
(SQL Server의 CONCATENATE 문자열에 GROUP BY를 사용하는 방법의 중복?)
해결법
-
==============================
1.깨끗하고 효율적인 솔루션을 위해 당신이 사용자 정의 집계 함수를 만들 수 있습니다, 당신이 필요로 그냥 뭐합니까 심지어 예를 들어이있다. 그런 다음 (표준 쿼리 계획과) 다른 집계 함수처럼 사용할 수 있습니다 :
깨끗하고 효율적인 솔루션을 위해 당신이 사용자 정의 집계 함수를 만들 수 있습니다, 당신이 필요로 그냥 뭐합니까 심지어 예를 들어이있다. 그런 다음 (표준 쿼리 계획과) 다른 집계 함수처럼 사용할 수 있습니다 :
-
==============================
2.이것은 할 것입니다 :
이것은 할 것입니다 :
SELECT mt.ID, SUBSTRING((SELECT mt2.Value FROM MyTable AS mt2 WHERE mt2.ID = mt.ID ORDER BY mt2.VALUE FOR XML PATH('')), 3, 2000) AS JoinedValue FROM MyTable AS mt
-
==============================
3.보다:
보다:
http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html
-
==============================
4.종종 여기 물었다.
종종 여기 물었다.
가장 효율적인 방법은 FOR의 XML 경로 트릭을 사용하고 있습니다.
-
==============================
5.이것은 단지 하나 개의 가능한 솔루션 나를왔다. 나는 성능에 대해 아무 생각이 없지만, 나는 그것이 문제를 해결하는 흥미로운 방법이 될 거라 생각 했어요. 나는 (내가 널 (NULL)에 대한 계정에 코드를하지 않았다) 간단한 상황에서 작동하는지 테스트했다. 그것을 당신을 위해 잘 수행하는 경우 볼 수있는 테스트를 제공하시기 바랍니다.
이것은 단지 하나 개의 가능한 솔루션 나를왔다. 나는 성능에 대해 아무 생각이 없지만, 나는 그것이 문제를 해결하는 흥미로운 방법이 될 거라 생각 했어요. 나는 (내가 널 (NULL)에 대한 계정에 코드를하지 않았다) 간단한 상황에서 작동하는지 테스트했다. 그것을 당신을 위해 잘 수행하는 경우 볼 수있는 테스트를 제공하시기 바랍니다.
내가 아이디 (MY_ID)를 포함 사용되는 테이블. 그것은 날짜 열 또는 무엇이든 될 수 있도록 그건 정말, 그룹 (grp_id) 내에서 고유 모든 열 수 있습니다.
;WITH CTE AS ( SELECT T1.my_id, T1.grp_id, CAST(T1.my_str AS VARCHAR) AS my_str FROM dbo.Test_Group_Concat T1 WHERE NOT EXISTS (SELECT * FROM dbo.Test_Group_Concat T2 WHERE T2.grp_id = T1.grp_id AND T2.my_id < T1.my_id) UNION ALL SELECT T3.my_id, T3.grp_id, CAST(CTE.my_str + T3.my_str AS VARCHAR) FROM CTE INNER JOIN dbo.Test_Group_Concat T3 ON T3.grp_id = CTE.grp_id AND T3.my_id > CTE.my_id WHERE NOT EXISTS (SELECT * FROM dbo.Test_Group_Concat T4 WHERE T4.grp_id = CTE.grp_id AND T4.my_id > CTE.my_id AND T4.my_id < T3.my_id) ) SELECT CTE.grp_id, CTE.my_str FROM CTE INNER JOIN (SELECT grp_id, MAX(my_id) AS my_id FROM CTE GROUP BY grp_id) SQ ON SQ.grp_id = CTE.grp_id AND SQ.my_id = CTE.my_id ORDER BY CTE.grp_id
from https://stackoverflow.com/questions/941103/concat-groups-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 마이크로 소프트 제트는 와일드 카드 : 별표 또는 백분율 기호를? (0) | 2020.03.24 |
---|---|
[SQL] 어떻게 저장된 프로 시저에 테이블 이름을 통과해야합니까? (0) | 2020.03.24 |
[SQL] 표가없는 MS Access에서 UNION 쿼리 (제트 / ACE) (0) | 2020.03.24 |
[SQL] SQL 쿼리는 SQL Server의 열을 기준으로 그룹과 함께 쉼표 구분에 집계 된 결과를 얻을 수 있습니다 (0) | 2020.03.24 |
[SQL] 어떻게 레일과 WHERE 절에서 IN의 대신에 사용 하는가? (0) | 2020.03.24 |