Использование Case и Group By для получения сгруппированных результатов в определенном порядке. - PullRequest
2 голосов
/ 17 марта 2012

Я задавал похожий вопрос в прошлом, но не совсем понял, что мне нужно, вот старый вопрос

Как получить идентификатор строк, которые имеют MAX и MINзначения в SQL

Что мне нужно сделать, это получить набор данных, который сгруппировал все элементы с одинаковым полем item в базе данных, но убедиться, что набор данных выводит подробности, относящиеся кконкретный идентификатор элемента, так что порядок группировки определенным образом.(в моем случае мне нужно сделать заказ либо по totalStock полю, либо price, если totalStock, то по порядку desc, если price, по порядку asc.

Я думаю что этот SO вопрос отвечает на мой вопрос лучше, но я не понимаю Joins боюсь

MySQL упорядочить результаты в GROUP BY

Вот пример того, где я нахожусь:

"SELECT * FROM (select *, count(id) as Variants, sum(totalStock) as sumTotalStock 
FROM `products` WHERE id > 0 AND `display`='1' 
GROUP BY item ORDER BY CASE WHEN totalStock > 0 THEN totalStock ELSE price END DESC) 
AS unknownVar 
ORDER BY sumTotalStock"

Мое потерянное понимание SQL нацелено на получение внутреннего набора результатов из моей базы данных, сгруппированной по item с группировкой, упорядоченной по totalStockесли totalStock > 0 или price в противном случае. Этот внутренний результирующий набор затем упорядочивается по sumTotalStock.

Важный бит

ORDER BY CASE WHEN totalStock > 0 THEN totalStock ELSE price END

Это дает мне две проблемы.

1) какой-то странный вывод, пропущен какой-то контент, который должен отображаться.

2) Кроме того, мне нужно иметь возможность изменить порядок сортировки

ORDER BY CASE WHEN totalStock > 0 *DESC* THEN totalStock ELSE price *ASC* END

сastrix'd DESC и ASC не работают, кажется, мне нужно поставить DESC в конце оператора ORDER BY, но тогда он упорядочивает DESC в eitheСлучай неправильный.

Учитывая две вышеупомянутые проблемы, я не уверен, что это вообще-то работает!

Я провел большую часть дня и весь вечер на этомтеперь с Google и различными вопросами SO, но я боюсь, что я сдался и должен был опубликовать еще один!

Если кто-нибудь мог бы опубликовать мне какой-нибудь код, который бы сортировал это, я был бы вечно благодарен!

Я использую базу данных MySQL, но столбцы totalStock и price являются числовыми во всех случаях, а item - это поле varChar.Как только я смогу работать с этими полями, я смогу извлечь все остальное, что мне нужно, так что, надеюсь, вам не нужно больше, чем это, чтобы указать мне правильное направление?

1 Ответ

0 голосов
/ 17 марта 2012

Попробуйте это

ORDER BY (CASE WHEN totalStock > 0 THEN totalStock ELSE -1 * price END) DESC

То, что вы делали раньше с ASC / DESC, не разрешено (и это действительно не должно быть, если вы думаете о том, что пытались сделать).Воспринимайте весь этот оператор CASE как переменный столбец, вы не можете отсортировать один и тот же столбец двумя разными способами, которые просто не имеют смысла

...