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
Спасибо, точно, что я ищу. :) –