2011-12-21 69 views
3

我有這些列的表:ID, Price, IsMonthlyPriceT-SQL的計算列排序

我如何可以選擇所有和排序每週價格,考慮到:

if (IsMonthlyPrice = false) then Price is weekly 

編輯:

我需要每週價格排序

每週價格月度價格將是:價格*52分之12

+0

如果您可以添加一些樣品數據和預期的輸出將會很有幫助。我想你想做一些從每週價格到每月價格的計算。如果是這樣,一個月內有多少個星期? – 2011-12-21 14:41:17

+0

你是什麼意思「考慮」?你的意思是你只想記錄「isMonthlyPrice = false」的記錄嗎?或者你想每週一次,然後每月?另外,該字段的數據類型是什麼? (有一個BIT類型,但不接受'false'作爲值) – MatBailie 2011-12-21 14:43:21

+0

我想選擇所有,並按周價格排序。但有些價格是按月存儲的,有些是按每週存儲的 – user441365 2011-12-21 14:46:04

回答

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' – 2011-12-21 17:49:14

+0

按號碼排序工作完美。正是我所需要的。 – 2015-11-11 21:02:51

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

我可能沒有把你的情況完全正確,但理論是重要的。 – 2011-12-21 14:44:02

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別名'工作正常。 – 2011-12-21 17:51:23

+0

我剛剛嘗試沒有別名,工作很好。奇怪的是,我是如何做到這一點的習慣。在SQL Server的過去中有沒有一點,或者是否有必要在order by子句中重複計算的場景? – 2011-12-21 18:01:18

+0

'ORDER BY'是唯一可以重用別名的地方,並且不能在'ORDER BY'的表達式中使用別名。 – 2011-12-21 18:03:24

0

可以使用case計算取決於價格是否每週或每月不同的值。

這將計算出的近似(每月假設31天)每天的價格進行排序:

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