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