code

SQL Server에서 group_concat을 사용하여 쿼리를 만드는 방법

codestyles 2020. 8. 19. 08:10
반응형

SQL Server에서 group_concat을 사용하여 쿼리를 만드는 방법


나는 SQL 서버에서 우리가 Group_concat기능을 사용할 수 없다는 것을 알고 있지만 여기에 Group_Concat내 쿼리 가 필요한 한 가지 문제가 있습니다. 나는 몇 가지 논리를 찾았지만 수정할 수는 없습니다.

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 ;

그것은 나에게 다음과 같은 결과를 준다.

여기에 이미지 설명 입력

처음 3 개 행을보세요. maskid, maskname, schoolid, schoolname은 동일하지만 maskdetail은 다르므로 마지막 열에 maskid별로 모든 maskdetail을 포함 할 수있는 행 하나를 원합니다.

나는 내 출력을 원한다.

여기에 이미지 설명 입력

그래서 질문을하는 동안 저를 도와주세요.

미리 감사드립니다.


질문:

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

추가 정보:

SQL Server 세계의 문자열 집계


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

다음과 같이 함수 선언 Scalar-Valued Function에서 사용할 수도 있습니다 MSSQL 2008
.

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 MD.MaskId=@MaskId

    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 ;

참고 : 전체 테이블 구조를 모르기 때문에 함수를 변경해야 할 수도 있습니다.


아래 쿼리를 실행하십시오. 귀하의 경우 STUFF 및 GROUP BY가 필요하지 않습니다.

Select
      A.maskid
    , A.maskname
    , A.schoolid
    , B.schoolname
    , CAST((
          SELECT  T.maskdetail+','
          FROM dbo.maskdetails T
          WHERE A.maskid = T.maskid
          FOR XML PATH(''))as varchar(max)) as maskdetail 
FROM dbo.tblmask A
JOIN dbo.school B ON B.ID = A.schoolid

참고 URL : https://stackoverflow.com/questions/17591490/how-to-make-a-query-with-group-concat-in-sql-server

반응형