根据下限和上限在桶中排列数据

Arrange Data in buckets based on lower and upperlimit

我 运行 遇到了一个问题,它让我把头上所有的头发都拔掉,以免以后去沙龙。好的,开始

总结

我有一个应用程序有一个基于用户上限和下限的批准者。因此,如果对于某个位置,如果金额为 200 美元,我必须 select 批准人,那么它将检查此金额在上限和下限之间的位置,并相应地 select 用户。

数据和期望的结果

这是我想要的结果

问题解释

对于结果集,我有存储桶(1-500、501-1000、1001-2500、2500-5000、5001 及以上),其中包含低于上限和下限的用户。问题是数据如何存储。如果您注意到 locationID 1 的下限值有矛盾,例如有 2 个下限值 1 和不同的上限值。同样,locationID 2 只有一条记录。这使得将用户放在他们指定的桶中变得相当困难。我正在寻找解决方案。

我试过的

我试图通过仅使用上限而不考虑下限来获得结果,但它会产生不良结果。我可以在此处 post 进行查询,但明知这是错误的,我认为这不是必需的。另外,我很清楚这里的规则,所以如果有人想要我的威胁查询

,请告诉我

拜托漂亮请拯救我的头发(还有剩下的)。

您需要每个位置一条记录,所以这意味着您需要在 LocationId 上对您的数据进行分组。然后你必须在每一列上做聚合函数。类似于:

select LocationID,
    min(case when 1 between LowerLimit and UpplerLimit and 500 between LowerLimit and UpperLimit then Username end) [1-500],
    min(case when 501 between LowerLimit and UpplerLimit and 1000 between LowerLimit and UpperLimit then Username end) [501-1000],
    ... etc.
from DataTable
group by LocationID

如果您的数据范围有任何重叠,它将在列中按字母顺序选择最小的用户名(因为 min 函数)。如果未填充范围,则该列将为 null.

例子

Select [LocationID]
      ,[1-500]     = [1]
      ,[501-1000]  = [2]
      ,[1001-2500] = [3]
      ,[2501-5000] = [4]
      ,[5001 plus] = [5]
From (
        Select Top 1 with ties 
               [LocationID]
              ,[Col] = Tier
              ,[Value] = Username
         From YourTable A
         Join (values (1   ,500   ,1)
                     ,(501 ,1000  ,2)
                     ,(1001,2500  ,3)
                     ,(2501,5000  ,4)
                     ,(5001,999999,5)
              ) B (R1,R2,Tier) on B.R1 between A.LowerLimit and A.UpperLimit
         Order By Row_Number() over (Partition By LocationID,B.Tier Order By UpperLimit)
     ) A
 Pivot (max([Value]) For [Col] in ([1],[2],[3],[4],[5]) ) p

Returns