2016-12-19 4 views
0

Я создаю отчет, который объединяет несколько таблиц. Все сошлось совершенно без одного аспекта. Мне нужно поле cost2, чтобы показать только самую высокую стоимость. В принципе, элемент проходит через несколько изменений затрат через производство, причем конечная стоимость является самой высокой. Мне нужно запросить только ту окончательную стоимость. Я знаю, что это простое решение, но я боролся больше, чем должен.SQL Server - фильтр по максимальному значению

Вот упрощенный пример моего запроса:
Функция 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 
+1

как бы вы определили окончательную стоимость? –

+0

Это опечатка на последнем INNER JOIN запятая вместо периода? 'table1, item_no' должно быть' table1.item_no' – xQbert

+0

Можете ли вы определить, что «не работает, как я его намеревался» ??? Если бы я собирался выкинуть некоторый psuedocode для определения вашего запроса на основе неопределенного описания, он выглядел бы точно так же, как вы опубликовали. Помогите нам понять проблему, и мы сможем помочь вам найти решение. Здесь отличное место для начала. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

ответ

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 
        ) 
1

Я думаю, что вы хотите 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 содержит только номер пункта. Вы получите все остальные столбцы для строки с наивысшей стоимостью.

Смежные вопросы