2012-07-03 2 views
1

에서 문자열 데이터를 집계하는 방법 :나는 데이터 테이블이 어떻게 T-SQL

|Key|Field |DateField | 
|A |Value1|2012-06-01| 
|A |Value2|2012-06-02| 
|A |Value3|2012-06-03| 
|B |Value4|2012-06-04| 
|B |Value5|2012-06-05| 

내가하여 키 문자열 데이터를 집계 할 -을 그룹에서처럼하지만 난 방법을 작동하지 않을 수 있습니다. 내가 끝낼 할 것은 :

|Key|Field Aggregate  | 
|A |Value1, Value2, Value3| 
|B |Value4, Value5  | 

더 나은 여전히 ​​시퀀스의 순서가 해당 날짜 필드의 순서에 따라 결정됩니다 집계에 삽입 된 순서 위치와 끝까지하는 것입니다.

|Key|Field Aggregate    | 
|A |1: Value1, 2: Value2, 3: Value3| 
|B |1: Value4, 2: Value5   | 

이것은 공통 테이블 식과 관련이있는 것처럼 보입니다.하지만 어떻게 해결할 수없는 것 같습니다.

일반적으로 SQL에서 이러한 종류의 작업을 수행하지 않습니다. 일반적으로 데이터를 응용 프로그램으로 가져 와서 코드에서 필요에 따라 조작합니다.

불행히도이 경우이 옵션에는 표시되지 않습니다.

어떻게 SQL Server 2005 T-SQL에서이 작업을 수행 할 수 있습니까?

CTE가 올바른 접근 방식입니까? 더 적절한 것이 있습니까?

+0

어떻게 순서를 결정합니까? 이 필드는 '필드'에 알파벳순으로 표시되어 있습니까? 아니면 주문을 지시하는 다른 열이 보이지 않습니까? –

+0

좋은 질문입니다. 명확히하기 위해 질문을 업데이트했습니다. –

답변

4
DECLARE @t TABLE([Key] CHAR(1), [Field] VARCHAR(32), DateField DATETIME); 

INSERT @t SELECT 'A','Value1','20120601' 
UNION ALL SELECT 'A','Value2','20120602' 
UNION ALL SELECT 'A','Value3','20120603' 
UNION ALL SELECT 'B','Value4','20120604' 
UNION ALL SELECT 'B','Value5','20120605'; 

;WITH x AS 
(
    SELECT [Key], [Field], rn = ROW_NUMBER() OVER 
    (PARTITION BY [Key] ORDER BY [DateField]) 
    FROM @t 
) 
SELECT [Key], [Field Aggregate] = STUFF(
    (SELECT ', ' + CONVERT(VARCHAR(12), rn) + ': ' + [Field] 
    FROM x AS x2 WHERE x2.[Key] = x.[Key] 
    ORDER BY rn 
    FOR XML PATH('') 
), 1, 2, '') 
FROM x 
GROUP BY [Key] 
ORDER BY [Key]; 

결과 :

Key Field Aggregate 
--- ------------------------------- 
A 1: Value1, 2: Value2, 3: Value3 
B 1: Value4, 2: Value5 

P.S. (

, TYPE).value('.', 'nvarchar(max)'), 1, 2, '') 

: 여기에

), 1, 2, '') 

: Field에 값이 XML (등 예 &, >, <)에 대한 문제가있는 문자를 포함 할 수 있다면이 줄을 변경 할 수 있습니다 이것은 자격 부여를 방지합니다.)

+0

순서는 원래 표의 추가 DateTime 필드에 의해 결정됩니다. 죄송합니다 - 나는 그 생각을 뒷모습으로 질문에 덧붙여 질문을 확인하지는 못했습니다. –

+0

샘플 데이터에서 아무 것도 변경하지 않더라도 'DateField'에 의한 주문을 위해 업데이트했습니다 ... –

+0

이런 종류의 코드는 SQL Server를 싫어하고 좋아합니다. – bfavaretto