同事工做中遇到一個問題:mysql
select count(billingdate),to_char(billingdate,'YYYYmm') monthsql
from tu_tradeoracle
where to_char(billingdate,'YYYY') ='2017'and reportstat = 30.net
group by month; blog
-----執行報錯,can't resolve month............get
由於Sql語句執行順序it
(7) SELECTio
(8) DISTINCT <select_list>table
(1) FROM <left_table>date
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
Group by不能用別名的緣由,由於執行到groupby(5)時,還沒執行到select中的別名,因此別名還沒生效。因此別名只能放到(7)以後,好比order中,distinct中。
遇到這種問題能夠使用子查詢替代
select month,count(month)
from
(selectcount(billingdate),to_char(billingdate,'YYYYmm') as month
from tu_trade
where to_char(billingdate,'YYYY') ='2017'and reportstat = 30) a
group by month;
注意:
在mysql中,group by中能夠使用別名;where中不能使用別名;order by中能夠使用別名。其他像oracle,hive中別名的使用都是嚴格遵循sql執行順序的,groupby後面不能用別名。mysql特殊是由於mysql中對查詢作了增強。