根据下限和上限在桶中排列数据
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
我 运行 遇到了一个问题,它让我把头上所有的头发都拔掉,以免以后去沙龙。好的,开始
总结
我有一个应用程序有一个基于用户上限和下限的批准者。因此,如果对于某个位置,如果金额为 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