2014-01-28 3 views
2

그래서 지금까지이 문제를 해결하기 위해 노력해 왔지만이 작업은 단순한 작업이어야한다고 생각했습니다. 내 목표는 반환 된 모든 고유 한 행의 단일 문자열을 슬래시로 구분하여 입력 한 후 순서대로 정렬하는 것입니다. 위치 그래서이 "OR1/ICU1을"라는 문자열을 반환 할 데이터의 위의 표 주어진 SQL Server 2008 +에서 ORDER BY 및 FOR XML로 DISTINCT를 선택하는 방법

Location Time 
======== ======= 
OR1  2013-02-06 16:55:47.000 
OR1  2013-02-06 16:56:34.000 
ICU1  2013-02-06 16:59:50.000 
OR1  2013-02-06 17:02:50.000 
ICU1  2013-02-06 17:09:50.000 

: 다음 예제 데이터를

표입니다. FOR XML PATH를 사용하여 고유 한 값을 문자열로 반환 할 수 있지만 ORDER BY를 던지 자마자 오류가 발생하여 모두 분리됩니다.

아이디어가 있으십니까?

답변

6

시도해보십시오. 여기

SELECT STUFF ((
    SELECT cast('/' as Varchar(max)) + Location 
    From Locations 
    Group by Location 
    Order by MAX(Time) FOR XML PATH('')) , 1 , 1 , '') as result 
+0

이 방법 http://sqlfiddle.com/#!3/e528e/2 – HKImpact

+0

하행 대한 sqlfiddle있다! 나는 STUFF 명령에 대해 결코 알지 못했다. 나는 네가 뭔가를 만들고 있다고 생각했다. 이것은 큰 일을했다. 감사. – mdutra

+0

당신은 mdutra를 환영합니다. – soysal

0

쿼리에서 임시 테이블을 사용하고 while 루프를 사용하지만 성능에 부정적인 영향을 줄 수있는 대규모 프로덕션 데이터에 대해서는 그렇게하지 않는 것이 좋습니다.

예를 들면.

/*Create our temp table */ 
DECLARE @MyTemp TABLE (Location VARCHAR(10), Processed BIT DEFAULT 0) 

/*Load the temp table will all the distinct locations */  
INSERT INTO @MyTemp SELECT DISTCINT Location FROM Locations 

/* need these variable to hold data */  
DECLARE @FinalString VARCHAR(1000) = '' 
DECLARE @Location VARCHAR(10) = '' 

/*as long as there is any row with an unprocessed location in the table 
we want to continue this process */ 
WHILE EXISTS(SELECT 1 FROM @MyTemp WHERE Processed = 0) 
BEGIN 
    /* Grab our next unprocessed location */ 
    SELECT TOP 1 @Location = Location FROM @MyTemp WHERE Processed = 0 ORDER BY Location 
    /* Add it to the final string */ 
    SET @FinalString = @FinalString + '/' + @Location 
    /* mark the location as processed */ 
    UPDATE @MyTemp SET Processed = 1 WHERE Location = @Location 
END 

/* get the final result (note this will have a leading '/') */ 
SELECT @FinalString