【问题标题】:How to make Ranking using case by Partition in SQL Server?如何在 SQL Server 中按分区使用大小写排名?
【发布时间】:2018-09-13 06:40:48
【问题描述】:

我需要做Ranking,如果值为负数,则按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

【问题讨论】:

  • 具有预期结果的样本数据将有所帮助
  • “它不起作用”是不是一个好的描述。如果您得到意想不到的结果,请解释您所期望的结果以及不匹配的原因。如果您收到 错误消息(我的预期),请告诉我们错误消息的内容。
  • 查询中缺少 ST_ItemEntry 表。请提供所有与范围相关的信息。

标签: sql sql-server stored-procedures ranking rank


【解决方案1】:

这是你追求的模式吗? 已简化代码以突出显示正在发生的事情

;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)

【讨论】:

    【解决方案2】:

    您不能动态更改条件。执行以下操作

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-13
      • 2015-06-29
      • 2014-05-10
      • 1970-01-01
      • 2011-03-18
      • 2011-05-11
      • 2021-05-09
      • 2012-12-25
      相关资源
      最近更新 更多