Как правильно писать ORDER BY… DESC в SQL select?

Вопрос:

Добрый день.

Проверьте структуру таблицы здесь.

Я хотел бы выбрать:

select 'idn' order by sum DESC,
where sum = (value amount where type = marks and status = up) - (value amount where type = marks and status = down)

Для этого я использую SQL:

select idn from Balans as outerB WHERE idn ! = '' group by idn order by
ifnull((select sum(innerB.amount) from Balans as innerB
where innerB.idn = outerB.idn
and type='up'), 0) -
ifnull((select sum(innerB.amount) from Balans as innerB
where innerB.idn = outerB.idn
and type='down'), 0) DESC
limit 5

Но в SQL не сделать правильный ORDER by... DESC

Например, в моем примере результат должен быть:

187113012

6299927

Тест SQL можно найти здесь

Скажите, пожалуйста, как правильно выбрать SQL?

Лучший ответ:

Как насчет использования CASE?

  SELECT idn,
         (SUM(CASE WHEN type = 'marks' AND status = 'up' THEN amount ELSE 0 END)-
         SUM(CASE WHEN type = 'marks' AND status = 'down' THEN amount ELSE 0 END)) 
         AS result
    FROM Balans b
   WHERE idn != ''
GROUP BY idn
ORDER BY result DESC
   LIMIT 5;

Live DEMO.

Ответ №1

Если вы захотите рассмотреть изменения в структуре базы данных, я бы предложил сохранить сумму в виде знакового значения, которое является положительным, если статус «вверх» и отрицательный, если статус «вниз».

В этих условиях ваш запрос будет намного проще.

SELECT idn, SUM(amount) as total
FROM Balans as outerB
WHERE idn !='' AND type = 'marks'
GROUP BY idn
ORDER BY total desc
LIMIT 5

Однако обратите внимание, что это не будет возвращать записи, которые не имеют никаких «меток» в таблице. Если вам нужно это поддержать, я думаю, вы вернулись к использованию операции CASE, аналогичной запросу в ответе Prix.

Оцените статью
TechArks.Ru
Добавить комментарий