order by 1 與 order by 列名

經常見sql語句中order by 1或者order by 2...order by N,有時候很莫名其妙.其實1表示第一個欄位,2表示第二欄位; 依此類推,當表中只有2個欄位時,oder by 3就會出錯,這個跟order by 列名沒有什麼區別,不過在特殊情況下還是很有用的.


例如table1(p_code int,issue_date datetime,issue_num int)

p_code       issue_date                              issue_num
101    2016-12-01 00:00:00.000          45
102    2016-12-01 00:00:00.000         89
102     2016-12-03 00:00:00.000         44
103     2016-12-03 00:00:00.000         44
101     2016-12-02 00:00:00.000         44
101     2016-12-03 00:00:00.000         44
101     2016-12-03 00:00:00.000         45
101     2016-12-03 00:00:00.000         44
101     2016-12-03 00:00:00.000         44
102     2016-12-03 00:00:00.000         47
101     2016-12-03 00:00:00.000         48
104     2016-12-03 00:00:00.000         86
101     2016-12-03 00:00:00.000         56
101     2016-12-03 00:00:00.000         29
101     2016-12-11 00:00:00.000         11


我想獲取某個p_code過去(不含當天)10次的issue_num平均值,

可能我們會這麼寫

select top 10 p_code, avg(issue_num) as avgissue from table1 
where issue_date<>(select convert(varchar(10),getdate(),120))
and p_code='101'
group by p_code
order by issue_date desc

但是以上寫法是錯誤,的,會提示 Column "table1.issue_date" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.必須要求issue_date在group by中.

所以我們改成

select top 10 p_code, avg(issue_num) as avgissue from table1 
where issue_date<>(select convert(varchar(10),getdate(),120))
and p_code='101'
group by p_code,issue_date
order by issue_date desc

但是得到的結果卻是(今天是2016.12.11)

p_code avgissue
101 44
101 44
101 45

顯然以上不是我們想要的結果.

那麼該如何結果這種問題呢,當然你可以再次進行avg()聚合運算,但是這裏我們既然說oder by N,那麼就用這個知識來解決.

語句如下.

select top 10 p_code, avg(issue_num) as avgissue from table1 
where issue_date<>(select convert(varchar(10),getdate(),120))
and p_code='101'
group by p_code
order by 2 desc


結果如下(今天是2016.12.11)

p_code avgissue
101 44

是不是很神奇呢!

當然作爲碼農,我們儘量用列名來解決,以便增加代碼的可讀性和易維護性.


相關鏈接:Order by 1 的解釋

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章