第二高的栏

时间:2018-09-07 20:19:53

标签: sql ms-access

我看到了类似的问题How to get second highest value among multiple columns in SQL ... ...但是该解决方案不适用于Microsoft Access(Row_Number / Over Partition在Access中无效)。

“我的访问”查询包含数十个字段。我想创建一个新的字段/列,该字段/列将返回查询中包含的10个特定列的第二个最大值,我将此字段称为“封面”。像这样:

    Product  Bid1    Bid2   Bid3   Bid4  Cover
    Watch    104     120    115    108   115
    Shoe     65      78     79     76    18
    Hat      20      22     19     20    20

我可以做一个很长的SWITCH公式,例如以下等效的Excel公式:

IF( AND(Bid1> Bid2, Bid1 > Bid3, Bid1 > Bid4), Bid1, 
    AND(Bid2> Bid1, Bid2 > Bid3, Bid2 > Bid4), Bid2,
    .....

但是必须有一个更有效的解决方案。如果MS-Access查询具有这样的功能,则等效的MAXIF可以很好地工作。

有什么想法吗?预先谢谢你。

1 个答案:

答案 0 :(得分:1)

如果将数据布置在更normalized way的位置,这会更容易。提示是编号的字段名称。

您的数据当前以Pivot的形式组织(在Access中称为crosstab),但可以很容易地归类为Unpivoted

如果以更标准化的方式放置此数据,则更容易处理,这种情况是:

  Product   Bid   Amount  
 --------- ----- -------- 
  Watch       1      104  
  Watch       2      120  
  Watch       3      115  
  Watch       4      108  
  Shoe        1       65  
  Shoe        2       78  
  Shoe        3       79  
  Shoe        4       76  
  Hat         1       20  
  Hat         2       22  
  Hat         3       19  
  Hat         4       20  

这种查询方式变得更简单。

您似乎想要最高出价(按产品分组),所以:

select Product, max(amount) as maxAmount
from myTable 
group by product

真的,我们根本不应该存储文本字段,因此Product应该是一个ID号,并且关联的产品名称​​一次存储在单独的表中,而不是多次< / em>,例如:

  ProdID   ProdName  
 -------- ---------- 
    1       Watch     
    2       Shoe      
    3       Hat       

...但这是另一堂课。

一般来说,应该避免重复任何内容 ...这几乎是数据库的目的 ...但是下面的链接会比我解释。:)