T-SQL суммирует числа в одну строку - PullRequest
0 голосов
/ 08 апреля 2011

Мне нужно суммировать числа вроде

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

Любая помощь будет высоко оценена.

Ответы [ 3 ]

5 голосов
/ 08 апреля 2011

Попробуйте это:

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 голосов
/ 08 апреля 2011
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.
1 голос
/ 08 апреля 2011

Попробуйте курсор. Запустите ваш скрипт для создания таблицы, затем этот

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...