2016-12-06 1 views
0

Возможно ли получить конкретную строку в запросе, используя SUM? Пример:Запрос Mysql получает SUM() определенную строку?

id tickets 
1 10   1-10  10=10 
2 35   11-45  10+35=45 
3 45   46-90  10+35+45=90 
4 110   91-200  10+35+45+110=200 

Итого: 200 билетов (In SUM), мне нужно, чтобы получить идентификатор строки, которые имеют билет с номером, как 23 (выход будет ID: 2, так как ID: 2 содержит 11-45tickets в SUM)

ответ

0

Вы, кажется, хотите строку, где «23» вписывается Я думаю, что это делает трюк:

select t.* 
from (select t.*, (@total := @total + tickets) as running_total 
     from t cross join 
      (select @total := 0) params 
     order by id 
    ) t 
where 23 > running_total - tickets and 23 <= running_total; 
+0

Спасибо, точно, что я ищу. :) –

1

Вы можете сделать это, определив локальную переменную в вашем select запросе (в form пункта), например:

select id, @total := @total + tickets as seats 
from test, (select @total := 0) t 

Вот SQL Fiddle.

+0

'select id, @ total + 1 as lower, @total: = @total + билеты как самые высокие из теста, (выберите @total: = 0) t' даст вам диапазон, который вы могли бы запросить, например. между. –

0
SELECT 
    d.id 
    ,d.tickets 
    ,CONCAT(
     TRIM(CAST(d.RunningTotal - d.tickets + 1 AS CHAR(10))) 
     ,'-' 
     ,TRIM(CAST(d.RunningTotal AS CHAR(10))) 
) as TicketRange 
    ,d.RunningTotal 
FROM 
    (
    SELECT 
     id 
     ,tickets 
     ,@total := @total + tickets as RunningTotal 
    FROM 
     test 
     CROSS JOIN (select @total := 0) var 
    ORDER BY 
     id 
    ) d 

Это похоже на Darshan's answer, но есть несколько важных отличий:

  • Вы не должны использовать неявный синтаксис объединения, Явные имеет больше функциональных возможностей в долгосрочной перспективе и является стандартом для более 20 лет
  • ORDER BY будет иметь огромное значение для вашей общей суммы при вычислении с переменной! если вы измените порядок, то он будет вычисляться по-разному, поэтому вам нужно подумать о том, как вы хотите выполнить общее количество, по дате? по id? от??? и убедитесь, что вы положили его в запрос.
  • Наконец-то я на самом деле вычислил диапазон.

А вот как вы можете сделать это без использования переменных.

SELECT 
    d.id 
    ,d.tickets 
    ,CONCAT(
     TRIM(d.LowRange) 
     ,'-' 
     ,TRIM(
      CAST(RunningTotal AS CHAR(10)) 
     ) 
    ) as TicketRange 
    ,d.RunningTotal 
FROM 
    (
    SELECT 
     t.id 
     ,t.tickets 
     ,CAST(COALESCE(SUM(t2.tickets),0) + 1 AS CHAR(10)) as LowRange 
     ,t.tickets + COALESCE(SUM(t2.tickets),0) as RunningTotal 
    FROM 
     test t 
     LEFT JOIN test t2 
     ON t.id > t2. id 
    GROUP BY 
     t.id 
     ,t.tickets 
    ) d 
Смежные вопросы