2009-02-09 4 views
2

연락처 목록이 포함 된 데이터베이스 테이블이 있습니다. 이러한 연락처 중 일부에는 여러 레코드가있을 수 있습니다.중복 레코드를 1 개의 필드에 병합하십시오.

CustomerID, CustomerName, Vehicle 
1, Dan, Mazda 
1, Dan, Suzuki 
2, John, Ford 
3, Dasha, Volvo 
3, Dasha, Ford 

뚜렷한 customerID와 CustomerName 및 차량 목록을 1 레코드로 반환하는 선택 쿼리를 작성할 수 있습니까? 즉

1, Dan, Mazda+Suzuki 
2, John, Ford 
3, Dasha, Volvo+Ford 

감사

+1

아래에 좋은 답변이 많으므로 여기에 추가 할 것은 없지만 데이터 모델은 데이터 모델링 101에서 "하지 않을 것"이라는 교과서라고 지적하고 싶습니다. CustomerID 및 CustomerName은 DB 정규화에 대한 매우 명확하고 불필요한 위반과 같습니다. –

답변

1

나는 그것이 하나의 SQL을 통해 수행 할 수 있는지 확실하지 않습니다. 그러나 마지막으로 sybase의 tsql에서이 작업을 시도했지만 임시 테이블과 커서를 사용했습니다. 따라서 최소한 그 경로를 사용하여 수행 할 수 있습니다.

3

일부 nice answers to this problem on another question이 있습니다.

the linked article에 따르면이 기능은 XML 기능을 사용하기 때문에 SQL Server 2005에서만 사용할 수 있습니다.

SELECT table_name, 
     LEFT(column_names,LEN(column_names) - 1) AS column_names 
FROM information_schema.columns AS extern 
     CROSS APPLY (SELECT column_name + ',' 
        FROM information_schema.columns AS intern 
        WHERE extern.table_name = intern.table_name 
        FOR XML PATH('') 
        ) pre_trimmed (column_names) 
GROUP BY table_name,column_names; 

두 번째 CROSS 버전을 적용 :

SELECT table_name, 
     LEFT(column_names,LEN(column_names) - 1) AS column_names 
FROM (SELECT table_name, 
       (SELECT column_name + ',' AS [text()] 
       FROM information_schema.columns AS internal 
       WHERE internal.table_name = table_names.table_name 
       FOR xml PATH ('') 
       ) AS column_names 
     FROM (SELECT table_name 
       FROM  information_schema.columns 
       GROUP BY table_name) AS table_names) AS pre_trimmed; 

두 번째 버전 (일반적으로 인정 하듯이 this post에서 영감을, 내가 이후에 발견 첫 번째 버전을 작성) - 문서에서 실행 계획에 따라 이 느리게 실행되지만, 수행하지 않았습니다. 전혀 벤치 마크.

+0

group_concat에 대한 링크를 제공해 주셔서 감사합니다. Google에 다른 키워드를 제공합니다 (Tomalak의 게시물은 아마도 위의 옵션을 한 곳에서 요약 한 것 같지만). – Dan

+0

링크가있는 Tomalak의 대답에 대해 –

0

저는 단일 SQL 쿼리를 통해이 작업을 수행 할 수 없다고 확신합니다.

일반적인 요구 사항 인 경우 각 고객 ID에 대해 호출되는 함수를 만들어야합니다.

SELECT abc.CustomerID, 
     dbo.udf_getCSVCustomerVehicles(abc.customerID) 
FROM  (SELECT DISTINCT CustomerID 
      FROM TABLE) abc 
ORDER BY abc.CustomerID 

그런 다음 값을 변수로 결합하여 결과를 리턴하는 스. 라 함수를 작성하십시오.

관련 문제