Как сделать ранжирование путем короткого замыкания двумя способами в SQL Server? - PullRequest
0 голосов
/ 14 сентября 2018

Мне нужно сделать ранжирование, если значение отрицательное, затем отсортировать его по 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

и DiscQty in Desc Order Когда `DiscQty> 0

1 Ответ

0 голосов
/ 14 сентября 2018

Вы хотите несколько ключей, как это:

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.

...