как вернуть последнюю строку в конкретную сумму? - PullRequest
0 голосов
/ 05 октября 2018

представьте себе, что у нас есть 1 строка, которая содержит студентов, которые содержат: идентификатор, имя, оценки и рейтинг.написать запрос, который возвращает фамилию ученика, где оценки равны 100, упорядоченные по классам.пример


 - id | name | marks | grade |
 - 01 | Jeff | 40    | 1 |
 - 02 | Annie| 40    | 3 |
 - 03 | Ramy | 20    | 5 |
 - 04 | Jenny| 20    | 2 |

, поэтому результат должен возвращать

Энни

, потому что Энни является последней строкой суммы оценок, где отмеченыравен 100. Джефф - первая причина, основанная на оценке, он равен 1, поэтому он должен быть введен первым, второй - Дженни, а третий - Энни.Джефф (40) + Дженни (20) + Энни (40) = 100

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Сохраните накопленную сумму marks в переменной.И используйте это как подзапрос и выберите строку, имеющую total, равную 100. Но если ни одна строка, имеющая совокупный итог, равный 100, не даст никакого результата.

Запрос

set @total := 0;
select `id`, `name`, `marks`, `grade` from(
    select `id`, `name`, `marks`, `grade`, (@total := @total + `marks`) as `total`
    from `your_table_name`
    order by `grade`
) as `t`
where `t`.`total` = 100;
0 голосов
/ 06 октября 2018

Как упомянуто выше, структура базы данных, ниже - один из способов получить выводоценивает как итоговое значение ОТ (шип, (выберите @total: = 0) t) упорядочено по классу) t ГДЕ всего <= 100) окончательное_порядок упорядочено по предельному пределу оценки 1 </p>

0 голосов
/ 05 октября 2018

Вы можете сделать текущую сумму пользовательской переменной MySQL.Этот запрос должен работать с MySQL 5.1 и выше.

Запрос

SELECT 
 Table1_alias.name
FROM (

  SELECT 
      Table1.name
   , (@running_marks_sum := @running_marks_sum + Table1.marks) AS running_marks_sum
  FROM 
   Table1
  CROSS JOIN (SELECT @running_marks_sum := 0) AS init_user_param
  ORDER BY 
    Table1.grade ASC  
) AS Table1_alias
WHERE 
 Table1_alias.running_marks_sum = 100

Результат

| name  |
| ----- |
| Annie |

Просмотр базы данных Fiddle

Только для MySQL 8.0+

Запрос

SELECT 
 Table1_alias.name
FROM (

  SELECT 
     Table1.name
   , SUM(Table1.marks) OVER(ORDER BY Table1.grade) AS running_marks_sum
  FROM 
    Table1

) AS Table1_alias 
WHERE 
  Table1_alias.running_marks_sum = 100;

Результат

| name  |
| ----- |
| Annie |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...