2016-06-10 2 views
1

다음 테이블의 레코드를 PolNo, Year, Platform, Number별로 단일 레코드로 통합하려고합니다.T-SQL은 여러 레코드를 하나의 레코드로 연결합니다.

| PolNo | YEAR | Platform | Number | Record | memo    | 
|-------|------|----------|--------|--------|---------------------| 
| 123 | 2010 | pc  | 1  | 1  | The user had issues | 
| 123 | 2010 | pc  | 1  | 2  | with the os.  | 
| 123 | 2009 | pc  | 2  | 1  | Replaced RAM  | 
| 123 | 2010 | mac  | 1  | 1  | Ordered new CDs  | 
| 564 | 2009 | mac  | 1  | 1  | Broken CD TRAY  | 
| 564 | 2010 | mac  | 1  | 1  | USB port dead  | 
| 564 | 2010 | pc  | 1  | 1  | Ordered replacement | 
| 564 | 2010 | pc  | 1  | 2  | laptop    | 

레코드가 단일 레코드로 통합됩니다 (레코드 열은 앞으로 전달되지 않음). 또한 동시에 PolNo, Year, Platform 및 Number가 개별 열이 아닌 ID로 연결됩니다.

| ID | YEAR | Platform | memo        | 
|-----|------|----------|----------------------------------| 
| 123 | 2010 | pc-1  | The user had issues with the os. | 
| 123 | 2009 | pc-2  | Replaced RAM      | 
| 123 | 2010 | mac-1 | Ordered new CDs     | 
| 564 | 2009 | mac-1 | Broken CD TRAY     | 
| 564 | 2010 | mac-1 | USB port dead     | 
| 564 | 2010 | pc-1  | Ordered replacement laptop  | 

위에서 알 수 있듯이, 위의 1 행 및 6 행의 레코드를 하나의 연속 메모 필드에 결합했습니다. 그러나 나는 결합하거나 결합하는 21 또는 22 개의 레코드가있는 메모 필드가 있습니다.

내가 어떻게 이런 일이 일어나는지 확신 할 수 없습니다.

생각하는 커서가 있지만 경험이별로 없으며 효과가 없다고 들었습니다. 표는 (그 중 22K 하나 개 이상의 기록이) 조작하는 64K의 주위에 행이

+0

에 오신 것을 환영합니다 : 경우 코드, XML 또는 데이터 샘플을 게시하십시오 ** ** 텍스트 편집기에서 해당 행을 강조 표시하고 편집기 툴바에서 "코드 샘플"버튼 ('{}) '을 클릭하여 멋지게 형식을 지정하고 구문을 강조 표시하십시오! –

+0

, Marc에게 감사드립니다 ... 내 OCD가이 편집기의 형식을 지정하려고 나를 죽이고있었습니다! : p – SidCharming

답변

2
당신은 기록 텍스트 집계 'XML위한'트릭을 이전을 사용할 수 있습니다

: StackOverflow의에

CREATE TABLE #Records 
(
    PolNo SMALLINT 
    , Year SMALLINT 
    , Platform NVARCHAR(16) 
    , Number TINYINT 
    , Record TINYINT 
    , Memo NVARCHAR(256) 
); 

INSERT INTO #Records(PolNo, Year, Platform, Number, Record, Memo) 
VALUES 
    (123, 2010, 'pc', 1, 1, 'The user had issues') 
    ,(123, 2010, 'pc', 1, 2, 'with the os.') 
    ,(123, 2009, 'pc', 2, 1, 'Replaced RAM') 
    ,(123, 2010, 'mac', 1, 1, 'Ordered new CDs') 
    ,(564, 2009, 'mac', 1, 1, 'Broken CD TRAY') 
    ,(564, 2010, 'mac', 1, 1, 'USB port dead') 
    ,(564, 2010, 'pc', 1, 1, 'Ordered replacement') 
    ,(564, 2010, 'pc', 1, 2, 'laptop') 

SELECT * 
FROM #Records; 

WITH RecordIdentifier AS 
(
    SELECT PolNo, Year, Platform, Number 
    FROM #Records 
    GROUP BY PolNo, Year, Platform, Number 
) 

SELECT CONCAT(PolNo, '-', Year, '-', Platform, '-', Number) AS Id 
    , (SELECT ' ' + Memo 
      FROM #Records forAggregation 
      WHERE forAggregation.PolNo = record.PolNo 
       AND forAggregation.Year = record.Year 
       AND forAggregation.Platform = record.Platform 
       AND forAggregation.Number = record.Number 
      ORDER BY forAggregation.Record 
      FOR XML PATH ('') 
      ) AS Memo 
FROM RecordIdentifier record 
ORDER BY Id 

DROP TABLE #Records 
+1

당신은 'FROM # 기록 for 기록'의 선택에서 나를 잃어 버렸습니다. 임시 테이블에 대한 별칭으로 볼 수 있지만 아래에 'AND forAggregation.Year = record.Year'문을 사용하고 있습니다. 기록은 어디 있습니까? 임시 테이블 # Record를 호출하지 않습니다. 예,하지만 해시가없는 이름 만 있습니다. BTW, 나는 당신의 모범을 배우는 의미에서 좋아한다. 나는 XML PATH에 익숙하지 않다. – SidCharming

+0

내부 선택 (forAggregation)은 "부모"('레코드')에 액세스 할 수 있습니다. - '레코드'는 외부입니다. "FROM RecordIdentifer 레코드 ORDER BY ID" –

+0

이것은 대단합니다! 나는 이것이 추진하고 있다는 것을 즐기고있다. 내가 필요한 것은 새로운 테이블을 채우는 결과를 가져 오는 것입니다 (b/c는 마이그레이션의 일부 임). 기존 테이블에 데이터를 INSERT하는 방법을 살펴 보았습니다. – SidCharming

관련 문제