2013-08-16 66 views
2

我一直在尋找了幾個小時試圖找出爲什麼ORDER BY不會對公式正常工作:ORDER BY公式工作不正常

SELECT *, 
    FORMAT(LowPriceCompetitor - (-(products.distPrice + 0.30)/((Rates.rate + 0.02 + Rates.defaultMarkup) - 1)), 2) AS margin 
FROM products 
LEFT JOIN Rates ON products.MasterCategoryID = Rates.categoryID 
ORDER BY margin 

我怎樣才能讓MySQL正確排序的輸出式?這應該工作!

+1

它*做*工作。 ORDER BY排序指定序列中的行。正如你通過查閱MySQL文檔發現的那樣,'FORMAT'函數返回一個字符數據類型。 ORDER BY正在操作字符串。而你想要的是對數值進行排序。將字符數據類型轉換爲數字的一種快速方法是將「0」添加到「123.4'+ 0」。 – spencer7593

回答

2

我很驚訝,我在這裏找不到這個。解決方案是使用ROUND而不是FORMAT。即

SELECT *, 
    ROUND(LowPriceCompetitor - (-(products.distPrice + 0.30)/((Rates.rate + 0.02 + Rates.defaultMarkup) - 1)), 2) AS margin 
FROM products 
LEFT JOIN Rates ON products.MasterCategoryID = Rates.categoryID 
ORDER BY margin 

我應該一直使用ROUND開始。 FORMAT以字符串形式返回結果... 我希望這可以幫助別人。

+0

你應該接受你的答案作爲正確的答案:) – Itay

+0

你是怎麼做到的?先回答然後問這個問題?問與答完全相同。 – vee

+0

@vinodadhikary我開始問這個問題,並在過程中發現了答案,所以我點擊了「回答你自己的問題」按鈕。顯然是爲了這個確切的情況而設立的。 –

3

快速方法作爲數值(例如,值由FORMAT()功能,或返回一個字符數據類型的任何其它表達返回)到字符串進行排序,

是添加零來表達。 MySQL將執行從字符到數字的隱式轉換:

SELECT FORMAT(lpc - (-(p.dp + 0.30)/((r.rate + 0.02 + r.dm) - 1)), 2) AS margin 
    FROM t 
    JOIN ... 
ORDER BY margin+0 
       ^^---- quick fix here is to add zero