2013-07-11 2 views
69

나는 SQL 서버에서 Group_concat 함수를 사용할 수 없다는 것을 알고 있지만 여기에 하나의 문제가 있습니다. 내 쿼리는 Group_Concat입니다. Google에서는 로직을 찾았지만 할 수 없습니다. 올바른 it.My의 SQL 쿼리 그것은 나를 그냥 그 maskid, maskname, schoolid에서 처음 3 개 행을 볼SQL 서버에서 group_concat으로 쿼리를 만드는 방법

enter image description here

같은 결과를 제공

select m.maskid,m.maskname,m.schoolid,s.schoolname, 
md.maskdetail 
from tblmask m join school s on s.id = m.schoolid 
join maskdetails md on m.maskid = md.maskid 
order by m.maskname ; 

입니다 schoolname은 동일하지만 그렇게하려면 다른 maskdetail입니다 ~ 한 마지막 열에 마스 크리드 당 모든 마스크 상세 정보를 포함 할 수있는 행.

은 그에 대한 쿼리를하는 동안 너무

enter image description here

그리고처럼 내 출력 on.So 저를 도와주세요 싶습니다.

미리 감사드립니다.

+1

[STRING_AGG] (https://docs.microsoft.com/en-us/sql/t-sql/functions)가 추가 된 이래로 SQL Server 2005에 관한 질문과 중복되는 것이 아닙니다./string-agg-transact-sql)을 SQL Server 2017로 가져와야하므로 최신 SQL Server를 사용하고 있는지 확인해보십시오. –

답변

92

쿼리 :

SELECT 
     m.maskid 
    , m.maskname 
    , m.schoolid 
    , s.schoolname 
    , maskdetail = STUFF((
      SELECT ',' + md.maskdetail 
      FROM dbo.maskdetails md 
      WHERE m.maskid = md.maskid 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
FROM dbo.tblmask m 
JOIN dbo.school s ON s.ID = m.schoolid 
ORDER BY m.maskname 

추가 정보 :

String Aggregation in the World of SQL Server

+0

hmmm @Devart를 설명 할 수 있습니다. 이미지 에서처럼 내부 결합에 결과가 나타납니다 ... 모든 중복 m.maskid를 결합합니다. , m.maskname , m.schoolid , s.schoolname은 필요한 행 하나 by –

+5

'tblmask' -'maskdetails' ='1 to many' 사이의 관계입니다. 그래서 중복 된 레코드가 없어야합니다. – Devart

+0

@ AmitSingh의 asnwer와 같은 단순한'PATH ('')'와는 달리'PATH (''), TYPE' 및'.value ('.', 'NVARCHAR (MAX)')'를 사용하는 이유는 무엇입니까? ? 귀하의 변종은 비용이 정당화 될 수있는 숨겨진 이점이 있습니까? 그렇지 않다면 수락 했으므로 답을 수정하거나 수정해야합니까? – pvgoran

19
Select 
     A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
    , STUFF((
      SELECT ',' + T.maskdetail 
      FROM dbo.maskdetails T 
      WHERE A.maskid = T.maskid 
      FOR XML PATH('')), 1, 1, '') as maskdetail 
FROM dbo.tblmask A 
JOIN dbo.school B ON B.ID = A.schoolid 
Group by A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
+4

+1. 그런데'GROUP BY'는 여기에 필요 없습니다. – Devart

5

는 아래 쿼리를 실행하십시오, 그것은 귀하의 경우 물건과 GROUP BY를 필요로하지 않습니다 :

+3

STUFF는 첫 번째 쉼표를 제거하는 데 필요합니다. maskdetail은 쉼표로 끝납니다. –

6

이또한

CREATE FUNCTION [dbo].[FunctionName] 
(@MaskId INT) 
RETURNS Varchar(500) 
AS 
BEGIN 

    DECLARE @SchoolName varchar(500)       

    SELECT @SchoolName =ISNULL(@SchoolName ,'')+ MD.maskdetail +', ' 
    FROM maskdetails MD WITH (NOLOCK)  
    AND [email protected] 

    RETURN @SchoolName 

END 

그리고

다음 최종 쿼리가

SELECT m.maskid,m.maskname,m.schoolid,s.schoolname, 
(SELECT [dbo].[FunctionName](m.maskid)) 'maskdetail' 
FROM tblmask m JOIN school s on s.id = m.schoolid 
ORDER BY m.maskname ; 

주처럼 될 것이라고 Scalar-Valued FunctionMSSQL 2008
는 다음과 같은 함수를 선언에서를 사용하여 달성 할 수 있습니다
당신에게 전체 테이블 구조를 모르기 때문에 함수를 변경해야 할 수도 있습니다.

+0

참고 : https://gooroo.io/GoorooTHINK/Article/10001/Aggregate-String-Concatenation-in-SQL-Server-2012- like-stringagg-in-PostgreSQL/5122 # .Wif5rLaZMWo – Magne

관련 문제