Sql Order By... используя `Case When` для разных восходящих, нисходящих и пользовательских заказов
Я хочу сортировать товар по скидке при определенных условиях
ORDER BY
CASE WHEN @OrderBy = 0
THEN table.id END ASC,
CASE WHEN @Orderby = 2
THEN table.id END ASC,
Я хочу сделать что-то вроде ниже, так как у меня нет столбца скидки в таблице
CASE WHEN @OrderBy = 4
THEN (100-((table.price/table.oldprice)*100) as discount END ASC
но он вызывает ошибку - как я могу сортировать по скидке?
Ответы
Ответ 1
Существует немало проблем, например. Вы не можете псевдоним поля вычисления в порядке, и вам нужно будет избежать имени вашей таблицы, исправить cae
и подсчитать скобки.
Кроме того, поскольку вам кажется, что вы просто хотите CASE
для одной переменной, вы можете переместить @OrderBy
в верхнюю часть CASE, например:
SELECT * from [table]
ORDER BY
CASE @OrderBy
WHEN 0
THEN [table].id -- ASC
WHEN 2
THEN [table].id * -1 -- DESC
---I want to do something like below as I don't have discount column in table
WHEN 4
THEN (100-([table].price/[table].oldprice)*100)
END
SqlFiddle Here
В стороне, если вам нужно динамически изменять ASC
или DESC
столбца, вы можете использовать хак, например , путем умножения на - 1.
(Также обратите внимание, что ORDER BY CASE ... END ASC, CASE ... END ASC
будет устанавливать первый, а затем второй порядок... это, похоже, не имеет смысла, учитывая, что @OrderBy
может иметь только одно значение)
Ответ 2
Мне кажется, вам нужно что-то похожее на это
select * from TableName where someCondition >100
order by
case when @OrderBy = 'AirlineService'
then AirlineService END desc,
case when @OrderBy = 'SomeMore'
then MyOtherColumn end
GO
Если у вас нет coulmn, то вы не можете сортировать с этим. Пожалуйста, прочтите это Microsoft Link Имейте в виду - порядок сортировки, используемый для столбцов, возвращаемых в инструкции SELECT.
Надеюсь, что это поможет.
Ответ 3
Не рассчитывайте скидку в ORDER BY
, но в SELECT
SELECT *, (100-(table.price/table.oldprice))*100 as discount
FROM table
...
ORDER BY
CASE WHEN @OrderBy = 0
THEN table.id END ASC,
CASE when @orderby=2
THEN table.id END ASC,
CASE WHEN @OrderBy = 4
THEN discount END ASC