2017-05-05 37 views
-2

我遇到了一个问题,它让我从头部拔出所有头发,并将未来的访问保存到沙龙中。好吧这里去根据上限和下限排列桶中的数据

摘要

我有了基于用户的上限和下限与之相关的审批申请。因此,如果对于某个位置,如果金额为$ 200,则必须选择审批者,然后它将检查此金额位于上限和下限之间的位置,并相应地选择用户。

数据和所需的结果

Approvers table

这里是结果,我想

Result

问题说明

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

我已经试过

我曾尝试只用上限和不考虑下限获得的结果,但它产生不良的结果。我可以在这里发布查询,但明知这是错误的,我不认为这是必需的。此外,我很了解这里的规则,所以请让我知道如果有人想要我的来势汹汹查询

请美丽请保存我的头发(以及他们剩下的)。

+0

这是一个报告或查询? –

+0

你能发布数据为文本吗?图片无法复制到SSMS –

+0

为什么downvotes? –

回答

1

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 

返回

enter image description here

+0

谢谢。从来不知道有什么像Ties。谢谢。你有博客吗? –

+0

@ankitsuhail快乐它帮助 –

0

您想要为每个位置记录一条记录,所以这意味着您需要在数据上输入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