Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 按SSRS中的顺序对数字列进行排序_Sorting_Date_Reporting Services_Sql Server 2012_Ssrs 2012 - Fatal编程技术网

Sorting 按SSRS中的顺序对数字列进行排序

Sorting 按SSRS中的顺序对数字列进行排序,sorting,date,reporting-services,sql-server-2012,ssrs-2012,Sorting,Date,Reporting Services,Sql Server 2012,Ssrs 2012,我正在使用Microsoft SQL Server 2012和Visual Studio 2012。在我的SQL代码中,我开发了一个列AgeBucket,它基本上会计算请求的开始日期和结束日期之间的天数。我的代码如下(我为它的长代码提前道歉。) 它是有效的,当我尝试将它放入我的SSRS报告的数据集中时,它也是有效的,但是对于列,数字出现了混乱。它显示6-10为最后一列,当按AgeBucket分组时,所有其他列似乎都是有序的。我意识到SSR可能会查看每列的第一个数字,这就是为什么在排序中最后抛出6

我正在使用Microsoft SQL Server 2012和Visual Studio 2012。在我的SQL代码中,我开发了一个列AgeBucket,它基本上会计算请求的开始日期和结束日期之间的天数。我的代码如下(我为它的长代码提前道歉。)

它是有效的,当我尝试将它放入我的SSRS报告的数据集中时,它也是有效的,但是对于列,数字出现了混乱。它显示6-10为最后一列,当按AgeBucket分组时,所有其他列似乎都是有序的。我意识到SSR可能会查看每列的第一个数字,这就是为什么在排序中最后抛出6-10

我的问题是,如何在SSR中对这些数字进行排序?我的ColumnGroups中有AgeBucket列,但不确定排序的最佳方式,以便按顺序获得正确列中的信息

         CASE WHEN 
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 0 AND 6
         THEN '0-5'
         WHEN 
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 6 AND 10
         THEN '6-10'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 11 AND 15
         THEN '11-15'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 16 AND 20
         THEN '16-20'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 21 AND 25
         THEN '21-25'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 26 AND 30
         THEN '26-30'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 31 AND 35
         THEN '31-35'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END BETWEEN 35 AND 40
         THEN '35-40'
         WHEN
            CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                 WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                 WHEN A.[EndDate] = A.[StartDate] THEN 1
         END > 40
         THEN '41+'
    END AS AgeBucket
    FROM CAST(A.StartDate AS DATE) = C1.[CAL_DT]        
    LEFT JOIN [dbo].[DT_DIM] AS C2 
    ON CAST(A.EndDate AS DATE) = C2.[CAL_DT]        
    LEFT JOIN [dbo].[DT_DIM] AS C3 
    ON CAST(GETDATE() AS DATE) = C3.[CAL_DT]

你有一些选择

  • 更改桶标签,使其按您喜欢的方式排序。它们是文本,所以添加前导零可能是您想要做的
  • '0-5'
    必须是
    '00-05'
    <代码>'6-10'->
    '06-10'
    ,等等。没那么漂亮

  • 在查询中添加另一个字段,类似于用于存储桶的字段,但使用数字而不是文本标签。使用此新字段在报告中进行排序 见下文。我已经这样处理过了

        CASE WHEN 
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 0 AND 6
             THEN 10
             WHEN 
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 6 AND 10
             THEN 20
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 11 AND 15
             THEN 30
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 16 AND 20
             THEN 40
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 21 AND 25
             THEN 50
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 26 AND 30
             THEN 60
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 31 AND 35
             THEN 70
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 35 AND 40
             THEN 80
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END > 40
             THEN 100
        END AS OrderBy
    
    使用新的
    OrderBy
    列在RDL中进行排序

  • 将当前查询包装在
    SELECT
    语句中,通过计算
    AgeBucket
    的值并设置适当的排序顺序,添加新列进行排序。在RDL中使用新列进行排序,如上文所述
  • 见下文

    SELECT AA.*, CASE WHEN AA.AgeBucket = '0-5' THEN 10
    WHEN AA.AgeBucket = '6-10' THEN 20
    ...
    ELSE 100 END AS OrderBy
    FROM (SELECT ...,
    CASE WHEN 
        CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                WHEN A.[EndDate] = A.[StartDate] THEN 1
        END BETWEEN 0 AND 6
        THEN '0-5'
        WHEN 
        CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                WHEN A.[EndDate] = A.[StartDate] THEN 1
        END BETWEEN 6 AND 10
        THEN '6-10'
        ...
        THEN '41+'
    END AS AgeBucket
    ...) AA -- End of wrapping SELECT
    

    祝你好运

    你有一些选择

  • 更改桶标签,使其按您喜欢的方式排序。它们是文本,所以添加前导零可能是您想要做的
  • '0-5'
    必须是
    '00-05'
    <代码>'6-10'->
    '06-10'
    ,等等。没那么漂亮

  • 在查询中添加另一个字段,类似于用于存储桶的字段,但使用数字而不是文本标签。使用此新字段在报告中进行排序 见下文。我已经这样处理过了

        CASE WHEN 
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 0 AND 6
             THEN 10
             WHEN 
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 6 AND 10
             THEN 20
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 11 AND 15
             THEN 30
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 16 AND 20
             THEN 40
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 21 AND 25
             THEN 50
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 26 AND 30
             THEN 60
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 31 AND 35
             THEN 70
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END BETWEEN 35 AND 40
             THEN 80
             WHEN
                CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                     WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                     WHEN A.[EndDate] = A.[StartDate] THEN 1
             END > 40
             THEN 100
        END AS OrderBy
    
    使用新的
    OrderBy
    列在RDL中进行排序

  • 将当前查询包装在
    SELECT
    语句中,通过计算
    AgeBucket
    的值并设置适当的排序顺序,添加新列进行排序。在RDL中使用新列进行排序,如上文所述
  • 见下文

    SELECT AA.*, CASE WHEN AA.AgeBucket = '0-5' THEN 10
    WHEN AA.AgeBucket = '6-10' THEN 20
    ...
    ELSE 100 END AS OrderBy
    FROM (SELECT ...,
    CASE WHEN 
        CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                WHEN A.[EndDate] = A.[StartDate] THEN 1
        END BETWEEN 0 AND 6
        THEN '0-5'
        WHEN 
        CASE WHEN A.[EndDate] > A.[StartDate] THEN C2.[BusinessCalendarDay] - C1.[BusinessCalendarDay]  
                WHEN A.[EndDate] IS NULL and A.[StartDate] IS NOT NULL THEN C3.[BusinessCalendarDay] - C1.[BusinessCalendarDay]
                WHEN A.[EndDate] = A.[StartDate] THEN 1
        END BETWEEN 6 AND 10
        THEN '6-10'
        ...
        THEN '41+'
    END AS AgeBucket
    ...) AA -- End of wrapping SELECT
    

    祝你好运

    您是正确的-它是按第一个字符排序的,因为您的字段是文本字段

    我只想在SSRS中你的小组的排序中使用IIF语句:

    =IIF(Fields!AgeBucket.Value = "0-5",   1, 
     IIF(Fields!AgeBucket.Value = "6-10",  2, 
     IIF(Fields!AgeBucket.Value = "11-15", 3, 
     IIF(Fields!AgeBucket.Value = "16-20", 4, 
     IIF(Fields!AgeBucket.Value = "21-25", 5, 
     IIF(Fields!AgeBucket.Value = "26-30", 6, 
     IIF(Fields!AgeBucket.Value = "31-35", 7, 
     IIF(Fields!AgeBucket.Value = "36-40", 8, 
     IIF(Fields!AgeBucket.Value = "41+", 9, 10)
    

    您是正确的-它是按第一个字符排序的,因为您的字段是文本字段

    我只想在SSRS中你的小组的排序中使用IIF语句:

    =IIF(Fields!AgeBucket.Value = "0-5",   1, 
     IIF(Fields!AgeBucket.Value = "6-10",  2, 
     IIF(Fields!AgeBucket.Value = "11-15", 3, 
     IIF(Fields!AgeBucket.Value = "16-20", 4, 
     IIF(Fields!AgeBucket.Value = "21-25", 5, 
     IIF(Fields!AgeBucket.Value = "26-30", 6, 
     IIF(Fields!AgeBucket.Value = "31-35", 7, 
     IIF(Fields!AgeBucket.Value = "36-40", 8, 
     IIF(Fields!AgeBucket.Value = "41+", 9, 10)
    

    我不清楚你想要什么。只有一个正确的位置可以放置排序:最外面的
    选择
    。在您的最终
    ORDER BY
    中,允许使用给定的别名。另一种方法是将完整查询包装为
    CTE
    ,并按col1、col2、
    从CTE顺序执行
    SELECT*。这同样适用于包装为sub-select的查询。你的意思是
    无序,而不是
    对吗?上面的代码更侧重于解释我如何创建我的AgeBucket字段。我的主要目标是,当我在SSRS中填充这个数据集字段时,当我按AgeBucket分组时,它并没有按顺序显示。最后出现的是“0-5”,“11-15”,“16-20”和“6-10”。但选中的答案解释了如何修复它,需要在SSRS列组类别中轻松排序。@搜索-不,列是无序的…不是行。我不清楚您想要什么。只有一个正确的位置可以放置排序:最外面的
    选择
    。在您的最终
    ORDER BY
    中,允许使用给定的别名。另一种方法是将完整查询包装为
    CTE
    ,并按col1、col2、
    从CTE顺序执行
    SELECT*。这同样适用于包装为sub-select的查询。你的意思是
    无序,而不是
    对吗?上面的代码更侧重于解释我如何创建我的AgeBucket字段。我的主要目标是,当我在SSRS中填充这个数据集字段时,当我按AgeBucket分组时,它并没有按顺序显示。最后出现的是“0-5”,“11-15”,“16-20”和“6-10”。但是检查过的答案解释了如何修复它,需要在SSRS列组类别中轻松排序。@搜索-不,列顺序错误…不是行。谢谢@Hannover,这正是我使用SSRS所需要的。谢谢你!谢谢@Hannover,这很有效,正是我使用SSRS所需要的。谢谢你!虽然这三种解决方案都有效,但在我的案例中,1和2没有必要有用#我很感谢你帮我回答。只检查上面的一个作为答案,因为它允许我在不操纵原始SQL代码的情况下简单地在SSR中排序。但是谢谢你,我感谢你的帮助!答案是一个很好的解决方案。我倾向于先修改SQL,因为我更像是一个数据库管理员。我想这一切都取决于你想在哪里改变,如果桶需要改变。。。RDL或SQL/存储过程。很乐意帮忙!虽然这三种解决方案都有效,但在我的案例中,1和2没有必要有用#我很感谢你帮我回答。只检查上面的一个作为答案,因为它允许我在不操纵原始SQL代码的情况下简单地在SSR中排序。但是谢谢你,我感谢你的帮助!答案是一个很好的解决方案。我倾向于首先修改SQL,因为我更像一个dat