Получение ошибки при использовании GROUP BY WITH ROLLUP и ORDER BY

Я мог бы использовать вашу помощь на этом. Я запускаю хранимую процедуру в SQL Server 2008 R2, где я импортирую данные в рабочий лист Excel.

Я могу импортировать нужную мне информацию, за исключением порядка вывода.

Вот что я получаю:

1 - OUTCO 
10 - OUT 
11 - MATCH 
12 - UNRSL 
2 - INCO 
3 - UNDEL 
4 - MAIL    
5 - NOTSU 
6 - NOMSI 
7 - RSRCH 
9 - IN 
9 - INCOM

Я хотел бы отобразить его с правильным числовым порядком.

1,2,3,4,5,6,7,9,9,10,11,12.

Вот код:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [Temp].[dmv_import]
     @date DATE = NULL,
     @import_type VARCHAR(5) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @date_work DATE

    IF @date IS NULL
       SET @date_work = GETDATE()
    ELSE
       SET @date_work = @date 

    SELECT 
        CASE
           WHEN CONVERT(VARCHAR(8), import_code) + ' - ' + vi.import_reason  IS NULL
              THEN 'TOTAL'
              ELSE CONVERT(VARCHAR(8), import_code) + ' - ' + vi.import_reason 
        END AS 'Category',
        SUM(CASE WHEN CONVERT(DATE, vi.createdate, 101) = @date_work THEN 1 ELSE 0 END) AS 'received',
        SUM(CASE WHEN CONVERT(DATE, vi.processed_date, 101) = @date_work THEN 1 ELSE 0 END) AS 'processed'
    FROM 
        DIMSNet.dbo.voter_import vi
    WHERE 
        vi.import_type IN ('DMV', 'DUP','INET') 
        AND import_code < 13
    GROUP BY
        CONVERT(VARCHAR(8), import_code) + ' - ' +vi.import_reason WITH ROLLUP
END

Я пробовал несколько разных предложений ORDER BY, но все равно получаю ошибки преобразования.

1) ORDER BY CONVERT(INT, LEFT((vi.import_code + ' - ' + vi.import_reason), 2))

2) ORDER BY LEFT((vi.import_code + ' - ' + vi.import_reason),PATINDEX('%[-]%',(vi.import_code + ' - ' + vi.import_reason)-1), CAST(RIGHT((vi.import_code + ' - ' + vi.import_reason), LEN((vi.import_code + ' - ' + vi.import_reason)) - 2) AS INT)

3) ORDER BY (CONVERT(VARCHAR(8), import_code) + ' - ' + vi.import_reason) ASC

4) порядок по регистру КОГДА ISNUMERIC(vi.import_code + '-' + vi.import_reason) = 1 THEN CAST(vi.import_code + '-' + vi.import_reason AS FLOAT) WHEN ISNUMERIC(LEFT((vi.import_code + ' - ' + vi.import_reason),1)) = 0 THEN ASCII(LEFT(LOWER((vi.import_code + ' - ' + vi.import_reason)),1)) ELSE 2147483647 Конец

Ни один из них не вернул правильно отформатированный вывод.

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


person user9909962    schedule 19.06.2018    source источник


Ответы (1)


Предполагая, что все ваши коды числовые, попробуйте следующее:

order by cast(max(import_code) as int)

Если нет, вы можете использовать выражение case:

order by (case when isnumeric(max(import_code)) = 1
               then max(import_code)
          end)

Ключевым моментом здесь является использование функции агрегации, чтобы просто упорядочить по import_code.

person Gordon Linoff    schedule 19.06.2018
comment
Я пробовал оба и каждый раз, когда получал это сообщение: Msg 245, уровень 16, состояние 1, процедура dmv_import, строка 28 [строка запуска партии 2] Преобразование не удалось при преобразовании значения varchar «IN» в тип данных int. - person user9909962; 19.06.2018
comment
@user9909962 . . . Вы конвертируете import_code в varchar() в SELECT. Это говорит о том, что это уже число. В любом случае, это должна быть часть числа, которая используется для order by, поэтому я не понимаю, как 'IN' будет в данных. - person Gordon Linoff; 20.06.2018