【问题标题】:Getting error using "GROUP BY WITH ROLLUP" and "ORDER BY"使用“GROUP BY WITH ROLLUP”和“ORDER BY”时出错
【发布时间】:2018-11-27 20:48:26
【问题描述】:

我可以在这方面使用您的帮助。我在 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 结束

这些都没有返回格式正确的输出。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server data-conversion rollup


    【解决方案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 排序。

    【讨论】:

    • 我都试过了,每次收到此消息时:“消息 245,级别 16,状态 1,过程 dmv_import,第 28 行 [Batch Start Line 2] 转换 varchar 值 'IN' 时转换失败到数据类型 int。”
    • @user9909962 。 . .您正在将import_code 转换为SELECT 中的varchar()。这表明它已经是一个数字。在任何情况下,它都应该是用于order by数字 部分,所以我看不到'IN' 在数据中的位置。
    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多