Как сделать ранжирование, используя индивидуальный раздел в SQL Server? - PullRequest
0 голосов
/ 13 сентября 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

Ответы [ 2 ]

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

Вы не можете изменить критерии динамически.Сделайте следующее

SELECT
    Brand,
    ItemNo,
    RANK() OVER (PARTITION BY ItemNo ORDER BY 
        CASE WHEN ISNULL(Disc, 0) > 0 THEN SUM(Quantity * Item.Cost) ELSE 0 END DESC,
        CASE WHEN ISNULL(ST_ItemEntry.Discrepancy, 0) < 0 THEN SUM(Quantity * Item.Cost) ELSE 0 END ASC
    ) AS [Rank]
FROM
    item
GROUP BY
    Brand,ItemNo
0 голосов
/ 13 сентября 2018

Это тот шаблон, который вам нужен? Упростили код, чтобы выделить происходящее

;WITH Example (n) AS
(
    SELECT 1    UNION ALL
    SELECT 2    UNION ALL
    SELECT 3    UNION ALL
    SELECT -1   UNION ALL
    SELECT -2   UNION ALL
    SELECT -3   
)
SELECT   n
        ,ROW_NUMBER() OVER (ORDER BY ABS(n)-0 DESC)
FROM Example
ORDER BY n,ROW_NUMBER() OVER (ORDER BY ABS(n)-0 DESC)
...