【问题标题】:SQL Server - Filter by Highest ValueSQL Server - 按最大值筛选
【发布时间】:2016-12-20 01:06:44
【问题描述】:

我正在构建一个将几个表连接在一起的报表。一切都完美地结合在一起,减去了一个方面。我需要 cost2 字段仅显示最高成本。基本上,一个项目在生产过程中会经历多次成本变化,最终成本最高。我只需要查询最终成本。我知道这是一个简单的解决方案,但我在这方面的努力超出了我的预期。

这是我的查询的简化示例:
MAX 功能没有按我的预期工作。

SELECT DISTINCT table1.item_no,
                table2.quantity,
                table2.date,
                table3.cost1,
                MAX(table4.cost2)
FROM table1
     INNER JOIN table2 ON table2.item_no = table1.item_no
     INNER JOIN table3 ON table3.item_no = table1.item_no
     INNER JOIN table4 ON table4.item_no = table1.item_no
WHERE table3.cost1 <> 0
GROUP BY table1.item_no,
         table2.quantity,
         table2.date,
         table3.cost1  

【问题讨论】:

  • 您如何确定最终成本?
  • 最后一个 INNER JOIN 的错字是逗号而不是句号吗? table1,item_no 应该是 table1.item_no
  • 你能定义“不像我想要的那样工作”吗???如果我要根据模糊的描述为您的查询定义抛出一些伪代码,它看起来与您发布的完全一样。帮助我们了解问题,我们可以帮助您找到解决方案。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • @vkp 它是 table4.cost4 的最高迭代次数。
  • @xQbert 编辑谢谢。

标签: sql sql-server filter max


【解决方案1】:
SELECT table1.item_no,
       table2.quantity,
       table2.date,
       table3.cost1,
       table4.cost2
FROM table1
     INNER JOIN table2 ON table2.item_no = table1.item_no
     INNER JOIN table3 ON table3.item_no = table1.item_no
     INNER JOIN table4 ON table4.item_no = table1,item_no
WHERE table3.cost1 <> 0
AND table4.cost4 = (SELECT MAX(a.cost4 ) 
                    FROM table4 a
                    WHERE
                        table4.item_no=a.item_no
                        GROUP BY a.item_no
                    )

【讨论】:

    【解决方案2】:

    我想你想要row_number():

    SELECT t.*
    FROM (SELECT t1.item_no, t2.quantity, t2.date, t3.cost1, t4.cost2,
               row_number() over (partition by t1.item_no order by t4.cost2 desc) as seqnum
          FROM table1 t1 INNER JOIN
               table2 t2
               ON t2.item_no = t1.item_no INNER JOIN
               table3 t3
               ON t3.item_no = t1.item_no INNER JOIN 
               table4 t4
               ON t4.item_no = t1.item_no
          WHERE t3.cost1 <> 0
         ) t
    WHERE seqnum = 1;
    

    因为您似乎希望每个项目有一行,所以partition by 仅包含项目编号。您将获得成本最高行的所有其他列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 2010-12-20
      相关资源
      最近更新 更多