Как найти максимальное значение из группы в SQL

Я просто изучаю SQL, поэтому у меня есть вопрос.

-У меня есть таблица с именем TABL

-Переменная :ccname который имеет значениеBottle"

Таблица выглядит следующим образом:

   +----------+---------+-------+--------+
   | Name     |  Price  |  QTY  |  CODE  |
   +----------+---------+-------+--------+ 
   | Rope     |   3.6   |   35  |   236  |
   | Chain    |   2.8   |   15  |   237  |
   | Paper    |   1.6   |   45  |   124  |
   | Bottle   |   4.5   |   41  |   478  |
   | Bottle   |   1.8   |   12  |   123  | 
   | Computer | 1450.75 |   71  |   784  |
   | Spoon    |   0.7   |   10  |   412  |
   | Bottle   |   1.3   |   15  |   781  |
   | Rope     |   0.9   |   14  |   965  |
   +----------+---------+-------+--------+

Теперь я хочу найти CODE из переменной :ccname с большим количеством! Итак, я перевел так:

SELECT CODE
FROM TABL
GROUP BY :ccname
WHERE QTY=MAX(QTY)

В идеальном мире, который превратится в результате 478, В мире SQL, что я должен написать, чтобы получить 478?

5 ответов

Решение

Попробуй это

SELECT CODE
FROM TABLENAme
WHERE QTY = (SELECT MAX(QTY) FROM TablName WHERE Name = :ccname)

Вы, вероятно, хотите что-то подобное:

SELECT code 
FROM TABL
WHERE Name=:ccname
ORDER BY QTY DESC
LIMIT 1

Идея в том, что мы находим все строки таблицы, чьи Name столбец совпадает с содержимым переменной :ccname, затем упорядочите их по количеству в порядке убывания, и сначала мы выбираем первый, который должен быть самым большим, поскольку они отсортированы в порядке убывания.

В зависимости от конкретной базы данных вы можете использовать один из следующих параметров, чтобы ограничить ваш набор результатов одним значением после упорядочения существующих столбцов через ORDER BY пункт:

  • SELECT TOP 1
  • LIMIT 1
  • FETCH FIRST 1 ROW ONLY

Примеры синтаксиса

  SELECT TOP 1 Code
    FROM TABL
   WHERE Name = :ccname
ORDER BY QTY DESC

или же

  SELECT Code
    FROM TABL
   WHERE Name = :ccname
ORDER BY QTY DESC
   LIMIT 1

или же

  SELECT CODE
    FROM TABL
   WHERE Name = :ccname
ORDER BY QTY DESC
   FETCH FIRST 1 ROW ONLY;

Использование ORDER BYсобственно WHEREи что-то, чтобы ограничить результирующий набор одной строкой:

SELECT CODE
FROM TABL
WHERE name = :ccname
ORDER BY QTY DESC
FETCH FIRST 1 ROW ONLY;

Примечание. Некоторые базы данных соответствуют стандарту ANSI. FETCH FIRST 1 ROW ONLY как LIMIT или как SELECT TOP 1,

Использование соединения также может эффективно решить вопрос:

Select t1.Code
From   TABL As t1 Join (
      Select Name, Max(table.QTY) as MaxQTY
      From   TABL
      Where  Name = :ccname
      Group by Name
) As t2
Where t1.QTY = t2.MaxQTY And t1.Name = t2.Name

Объяснение:

Сначала вы вычисляете максимальное значение "Бутылки", используя подзапрос, а затем соединяете две таблицы, чтобы выбрать соответствующую строку с MaxQTY и тем же именем.

Другие вопросы по тегам