代码之家  ›  专栏  ›  技术社区  ›  Liam neesan

在sqlserver中如何通过两种不同的方式进行排名?

  •  0
  • Liam neesan  · 技术社区  · 6 年前

    我需要做排名,如果值是负数,然后按Asc排序,如果是正数,然后按Desc排序

    select
        Itemcode,
        isnull(sum(ss.DiscQty * ss.Cost),0) DescCost,
        RANK()OVER(Partition by Itemcode order by 
            case when isnull(sum(ss.DiscQty * ss.Cost),0) < 0 THEN isnull(sum(ss.DiscrepancyQty * ss.Cost),0) END ASC,
            case when isnull(sum(ss.DiscQty * ss.Cost),0) > 0 THEN isnull(sum(ss.DiscQty * ss.Cost),0) END DESC
        ) RANKS
    from
        ss
    Group by
        ItemNo
    

    期望结果

    ItemCode    DiscQty    Rank
    ===========================
    111         -5000       1
    121         -4500       2
    222          10000      3
    223          3000       4
    

    但我得到的排名都是1,

    我只想整理一下 DiscQty 在里面 Asc 什么时候? DiscQty < 0

    在里面 Desc Order 当`DiscQty>0

    1 回复  |  直到 4 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    您需要这样的多个键:

    RANK() OVER (ORDER BY (CASE WHEN SUM(ss.DiscQty * ss.Cost) < 0 THEN SUM(ss.DiscQty * ss.Cost) ELSE 0 END) ASC,
                          SUM(ss.DiscQty * ss.Cost) DESC
    ) RANKS
    

    PARTITION BY .