2011-12-21 5 views
3

У меня есть таблица с этими столбцами: ID, Price, IsMonthlyPriceT-SQL сортировки с помощью вычисляемого столбца

Как я могу выбрать все и сортировать по еженедельным цене, принимая во внимание, что:

if (IsMonthlyPrice = false) then Price is weekly 

EDIT:

мне нужно сортировать по цене еженедельного

еженедельно цены месячной стоимости будет: Цена * 12/52

+0

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

+0

Что значит «принимать во внимание»? Вы имеете в виду, что вам нужны только записи, где «isMonthlyPrice = false»? Или вы хотите Еженедельно сначала, а затем Ежемесячно? Кроме того, какой тип данных действительно является этим полем? (Существует тип BIT, но это не принимает значение «false» как значение) – MatBailie

+0

Я хочу выбрать все и заказать по недельной цене. Но некоторые цены хранятся как ежемесячно, а некоторые хранятся как еженедельно. – user441365

ответ

13

Вам не нужно включать в расчет два раза. Вы можете заказать по номеру столбца

SELECT 
    ID, 
    Price, 
    IsMonthlyPrice, 
    CASE IsMonthlyPrice 
    WHEN 1 THEN Price * 12/52 
    ELSE price 
    END 
FROM [TABLE] 
    order by 
     4 
+8

Лучше дать столбцу псевдоним и 'ORDER BY alias' –

+0

Заказ по номеру отлично работает. Именно то, что мне было нужно. –

4

Не уверен, если это то, что вы ищете, но, может быть, попробовать:

select 
    id, 
    case isMonthlyPrice when 'false' then (price*52/12) else price end normalizedPrice 
from 
    yourTable 
order by 
    normalizedPrice 
0

Я вообще обернуть выберите в другой. то колонка больше не «рассчитана»

select Price, ID from (select ID, Price, [calculate the IsMonthly Price] as 'IsMonthlyPrice' from table) order by IsMonthlyPrice 
+0

Возможно, я не получил ваше дело полностью правильно, но теория все это имеет значение. –

3

Вы можете отсортировать расчетные столбцы, используя два подхода. Более словесный подход (непроверенный псевдокод) является:

select ID, CASE WHEN IsMonthlyPrice = 0 THEN Price * 52/12 ELSE Price END AS Price 
ORDER BY CASE WHEN IsMonthlyPrice = 0 THEN Price * 52/12 ELSE Price END 

более лаконичный подход:

select * from 
(
select ID, CASE WHEN IsMonthlyPrice = 0 THEN Price * 52/12 ELSE Price END AS Price 
) as derived 
ORDER BY derived.Price 
+1

Не нужно это делать. 'ORDER BY alias' отлично работает. –

+0

Я просто пробовал без псевдонима, отлично работал. Странно, как я просто делаю это по привычке. Был ли смысл в прошлом SQL Server или существуют ли сценарии, где необходимо повторять вычисления в порядке заказа? –

+0

'ORDER BY' - это единственное место, где вы можете повторно использовать псевдоним, и вы не можете использовать псевдоним в выражении в' ORDER BY'. –

0

Вы можете использовать case рассчитать различные значения в зависимости от того, цены еженедельно или ежемесячно.

Это рассчитает приблизительную (предполагается, что 31 дней в месяц) Цена за сутки сортировать по:

select ID, Price, IsMonthlyPrice 
from TheTable 
order by Price/case IsMonthlyPrice when 1 then 31.0 else 7.0 end