복붙노트

[SQL] MSSQL - GROUP_CONCAT

SQL

MSSQL - GROUP_CONCAT

다음은 샘플 데이터는 다음과 같습니다

IdProduit   Localisation    Qte_EnMain
4266864286880063006 E2-R40-B-T  13.00000
4266864286880063006 E2-R45-B-T  81.00000
4266864286880063007 E2-R45-C-T  17.00000
4266864286880063008 E2-R37-B-T  8.00000

그리고 이것은 내가하고 싶은 것입니다

IdProduit           AllLocalisation
4266864286880063006 E2-R40-B-T (13), E2-R45-B-T (81)
4266864286880063007 E2-R45-C-T (17)
4266864286880063008 E2-R37-B-T (8)

나는 포럼 GROUP_CONCAT의 모든 예제를 본 나는 몇 가지 테스트를 시도했다.

정말 다도를 이해하지 못하는 ().

여기에 내가하고 싶은 것입니다 :

SELECT
  a.IdProduit,
  GROUP_CONCAT(
      CONCAT(b.Localisation, ' (', CAST(ROUND(a.Qte_EnMain, 0) AS NUMERIC(36, 0)), ')')
  ) AS AllLocation
FROM
  ogasys.INV_InventENTLoc a
  LEFT JOIN ogasys.INV_LocName b ON a.IdLoc = b.IdLoc
GROUP BY a.IdProduit, b.Localisation, a.Qte_EnMain

GROUP_CONCAT은 MSSQL 작업을하지 않기 때문에 지금이 내가이 포럼의 모든 예제를 생성 한 쿼리입니다.

SELECT
  DISTINCT
  a1.IdProduit,
  STUFF((SELECT DISTINCT '' + b2.Localisation
         FROM
           ogasys.INV_InventENTLoc a2
           LEFT JOIN ogasys.INV_LocName b2 ON a2.IdLoc = b2.IdLoc
         WHERE a2.IdLoc = a1.IdLoc
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 0, '') data
FROM
  ogasys.INV_InventENTLoc a1
  LEFT JOIN ogasys.INV_LocName b1 ON a1.IdLoc = b1.IdLoc
ORDER BY a1.IdProduit

쿼리는 내가이 쿼리 작업을하는 방법을 이해하지 않는 행에 의해 하나의 현지화를 반환합니다.

편집하다:

여기 내 상황에 대한 솔루션입니다 :

SELECT
  a.IdProduit,
  STUFF(
      (SELECT ', ' + b2.Localisation + ' (' + CAST(CAST(ROUND(a2.Qte_EnMain, 0) AS NUMERIC(36, 0)) AS VARCHAR(32)) + ')'
       FROM ogasys.INV_InventENTLoc a2
         LEFT JOIN ogasys.INV_LocName b2 ON a2.IdLoc = b2.IdLoc
       WHERE a.IdProduit = a2.IdProduit
       FOR XML PATH (''))
      , 1, 1, '') AS AllLocalisation
FROM
  ogasys.INV_InventENTLoc a
  LEFT JOIN ogasys.INV_LocName b ON a.IdLoc = b.IdLoc
GROUP BY a.IdProduit

해결법

  1. ==============================

    1.다도를 사용하여

    다도를 사용하여

    declare @table table (IdProduit varchar(100), Localisation varchar(50),  Qte_EnMain float)
    
    insert into @table
    values 
    ('4266864286880063006','E2-R40-B-T',  13.00000),
    ('4266864286880063006','E2-R45-B-T',  81.00000),
    ('4266864286880063007','E2-R45-C-T',  17.00000),
    ('4266864286880063008','E2-R37-B-T',  8.00000)
    
    
    select IdProduit,
      STUFF (
            (SELECT   
                    ',' + localisation + concat(' (',cast(qte_enMain as varchar(4)),') ')
            FROM @table t2
            where t2.IdProduit = t1.IdProduit
            FOR XML PATH('')), 1, 1, ''
        )
     from @table t1
    group by
    IdProduit
    
  2. from https://stackoverflow.com/questions/49784024/mssql-group-concat by cc-by-sa and MIT license