【问题标题】:sql Create a Index ID as a new column to sort the case categories i just created Sql serversql 创建一个索引 ID 作为新列来对我刚刚创建的案例类别进行排序 Sql server
【发布时间】:2020-01-28 15:17:51
【问题描述】:

我想创建一个 SortID 列来对不同案例类别的结果进行排序。每个案例类别代表一个收入范围。我按案例报表上的结果进行分组,以获得每个案例的订单数量。现在我被这个 SortID 创建问题困住了。请在下面找到我当前的查询。请建议我在哪里可以将索引创建语句放在查询中。非常感谢提前!

select SalesAmountCategory, count(*) as Orders 
from
    (Select case
            when ((SalesAmount-TaxAmt-Freight)>=100000) then '>$100000'
            when ((SalesAmount-TaxAmt-Freight)>=50000) then '$50000-$100000'
            when ((SalesAmount-TaxAmt-Freight)>=10000) then '$10000-$50000'
            when ((SalesAmount-TaxAmt-Freight)>=5000) then '$5000-$10000'
            when ((SalesAmount-TaxAmt-Freight)>=2500) then '$2500-$5000'
            when ((SalesAmount-TaxAmt-Freight)>=1000) then '$1000-$2500'
            when ((SalesAmount-TaxAmt-Freight)>=500) then '$500-$1000'
            when ((SalesAmount-TaxAmt-Freight)>=100) then '$100-$500'
            when ((SalesAmount-TaxAmt-Freight)<100) then '$0-$100'
            end as SalesAmountCategory
        From  dbo.FactResellerSales 
        where OrderDate BETWEEN '2010-01-01 00:00:00.000' AND '2010-12-31 23:59:59.999'
    ) as t
    group by SalesAmountCategory
    order by SalesAmountCategory;

请在下面找到图片作为预期结果示例

【问题讨论】:

    标签: sql sql-server tsql indexing case


    【解决方案1】:

    我会使用apply而不是子查询,你可以使用row_number来创建sortid:

    select row_number() over (order by min(SalesAmount - TaxAmt - Freight)) as sortid,
           SalesAmountCategory, count(*) as Orders
    from dbo.FactResellerSales frs cross apply
         ( values (case when (SalesAmount - TaxAmt - Freight) >= 100000 then '>$100000'
                        when (SalesAmount - TaxAmt - Freight) >= 50000) then '$50000-$100000'
                        . . .
                        when (SalesAmount - TaxAmt - Freight) < 100 then '$0-$100'
                   end)
         ) frss(SalesAmountCategory)
    where OrderDate BETWEEN '2010-01-01 00:00:00.000' AND '2010-12-31 23:59:59.999'
    group by SalesAmountCategory;
    

    【讨论】:

    • 感谢您的评论。但是在我的示例中仍然没有创建像 SortID 这样的新索引列。
    • @vivianna。 . .我错过了那部分。已编辑。
    【解决方案2】:

    不是按类别排序,而是按每个类别的最小数量排序:

    select row_number() over (order by min(SalesAmount-TaxAmt-Freight)) as sortid,
    . . . 
    order by min(SalesAmount-TaxAmt-Freight)
    

    当然,您还需要在子查询中选择这些列(或在子查询中进行计算)。

    【讨论】:

    • 非常感谢。但仍然不知道如何在我的示例中创建像 SortID 这样的新列
    • @vivianna 。 . .我没有意识到这是你问题的一部分。您只需将row_number() 与相同的order by 表达式一起使用。您不需要创建这样的列来对结果集进行排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多