2011-04-08 4 views
0

나는 것입니다 결과를 같은 방법으로 간단한 형태로T-SQL 요약한다 번호는

CREATE TABLE #t(num int); 

INSERT #t 
SELECT 10001 UNION ALL 
SELECT 10002 UNION ALL 
SELECT 10003 UNION ALL 
SELECT 10004 UNION ALL 
SELECT 10005 UNION ALL 
SELECT 10006 UNION ALL 
SELECT 10007 UNION ALL 
SELECT 10008 UNION ALL 
SELECT 10009 UNION ALL 
SELECT 10010 UNION ALL 
SELECT 10020 UNION ALL 
SELECT 10030 UNION ALL 
SELECT 10040 UNION ALL 
SELECT 10041 UNION ALL 
SELECT 10042 UNION ALL 
SELECT 10043 UNION ALL 
SELECT 10050 UNION ALL 
SELECT 10060 UNION ALL 
SELECT 10070 UNION ALL 
SELECT 10075 UNION ALL 
SELECT 10076 UNION ALL 
SELECT 10077; 

--DROP TABLE #T; 

같은 숫자를 요약해야합니다.

10001-10010, 10020, 10030, 10040-10043, 10050, 10060, 10070, 10075-10077 

어떤 도움을 주시면 감사하겠습니다.

+0

거기 TSQL 절차를 할 수있는 현명한 방법이 될 수 있지만, 수도는 아마 쉽게 당신의 응용 프로그램 언어에서 함께 쿼리를 넣어. 어떤 언어가 될까요? –

+0

SQL Server의 버전은 무엇입니까? –

+1

맞아요. CSharp.net에서 레거시 애플리케이션 (vb6)을 리엔지니어링하고 있습니다. :) –

답변

5

이 시도 :

WITH CTE1 AS 
(
    SELECT *, num - ROW_NUMBER() OVER(ORDER BY num) Corr 
    FROM #t 
), CTE2 AS 
(
    SELECT MIN(num) MinNum, MAX(num) MaxNum, Corr 
    FROM CTE1 
    GROUP BY Corr 
) 

SELECT CAST(MinNum AS VARCHAR) + 
     CASE WHEN MaxNum != MinNum THEN ' - ' + CAST(MaxNum AS VARCHAR) ELSE '' END Res 
FROM CTE2 
4
DECLARE @Result VARCHAR(MAX); 

WITH q AS (
SELECT 
    Num, 
    Num - (ROW_NUMBER() OVER (ORDER BY Num)) AS RowNumber 
FROM 
    #t 
) 
SELECT 
    @Result = ISNULL(@Result + ',', '') + 
    CASE WHEN MIN(Num) != MAX(Num) 
     THEN CAST(MIN(Num) AS VARCHAR) + '-' + CAST(MAX(Num) AS VARCHAR) 
     ELSE CAST(MIN(Num) AS VARCHAR) 
    END 
FROM q 
GROUP BY RowNumber 

PRINT @Result 
-- Or... SELECT @Result.. whichever. 
+0

정말 고마워요. –

1

가 커서를 사용해보십시오. 테이블을 생성하는 스크립트를 실행,이

DECLARE cur CURSOR FOR 
SELECT num FROM #t 

OPEN cur 
DECLARE @nm INT; 
DECLARE @start INT; 
DECLARE @prev INT; 
DECLARE @retVal VARCHAR(MAX); 
SET @retVal = ''; 

FETCH NEXT FROM cur INTO @nm 
SET @prev = NULL; 
SET @start = NULL; 
WHILE (@@fetch_status = 0) 
BEGIN 
    IF (@prev IS NOT NULL) 
    BEGIN 
     IF (@prev = @nm - 1) 
     BEGIN 
      SET @prev = @nm; 
     END 
     ELSE 
     BEGIN 
      IF (@start = @prev) 
       SET @retVal = @retVal + CAST(@start AS VARCHAR) + ', ' 
      ELSE 
       SET @retVal = @retVal + CAST(@start AS VARCHAR) + ' - ' + CAST(@prev AS VARCHAR) + ', ' 

      SET @prev = @nm; 
      SET @start = @nm; 
     END 
    END 
    ELSE 
    BEGIN 
     SET @prev = @nm; 
     SET @start = @nm; 
    END 

    --PRINT(@nm) 
    FETCH NEXT FROM cur INTO @nm 
END 

CLOSE cur 
DEALLOCATE cur 

IF (@start = @prev) 
    SET @retVal = @retVal + CAST(@start AS VARCHAR) + ', ' 
ELSE 
    SET @retVal = @retVal + CAST(@start AS VARCHAR) + ' - ' + CAST(@prev AS VARCHAR) + ', ' 

IF (LEN(@retVal) > 1) 
    SET @retVal = SUBSTRING(@retVal, 1, LEN(@retVal) - 1) 

PRINT(@retVal) 
+0

nooooooooooo .....하지 마세요. 이제까지. –

+0

커서 선언에'FAST_FORWARD'을 추가 할 수도 있습니다 –

+0

@nathan gonzalez 왜? –