有一個張發貨表,先取發貨表中四月到五月發貨量前五的運輸方式,再在這五個運輸方式中取每個運輸方式發貨量前五的國家,請問能一次取到相關資料嗎
uj5u.com熱心網友回復:
能不能把表結構和樣例資料給一部分出來啊?我的思路是用子查詢,先通過子查詢,按發貨方式匯總發貨量,找到排名前五的,然后外面關聯原表,再按發貨方式和國家匯總發貨量,就取到了排名前五的國家;偽代碼如下:select
發貨方式
,國家
,sum(發貨量)
from table1 a
inner join (select
發貨方式
,sum(發貨量)
from table1 a
where 時間 between 4月 and 5月
group by 發貨方式
order by sum(發貨量) desc
limit 5) b
on a.發貨方式 = b.發貨方式
where a.發貨方式 = b.發貨方式
and where 時間 between 4月 and 5月
group by 發貨方式 ,國家
order by sum(發貨量) desc
不對,這種取法可以取到每種發貨方式國家發貨的發貨量排列順序,可是沒辦法取到排名前5的國家
uj5u.com熱心網友回復:
想了想,想了個最笨的方法,想不出更好的方法了,其他人如果有更好的方法,還望不吝賜教:select
發貨方式
,國家
,發貨量_sum
,if( @objno = a.國家,
@rank:= @rank+1,
@rank:=1) as row_number
,@objno = a.國家
from
(select
發貨方式
,國家
,sum(發貨量) as 發貨量_sum
from table1 a
inner join (select
發貨方式
,sum(發貨量)
from table1 a
where 時間 between 4月 and 5月
group by 發貨方式
order by sum(發貨量) desc
limit 5) b
on a.發貨方式 = b.發貨方式
where a.發貨方式 = b.發貨方式
and where 時間 between 4月 and 5月
group by 發貨方式 ,國家
order by 發貨方式
,國家,sum(發貨量) desc
)a
,(@objno:=NULL, @rank:=0) b
where row_number<=5
因為mysql本身不支持諸如oracl等支持的over(partition by )函式,所以寫起來有點兒費勁
uj5u.com熱心網友回復:
。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/59338.html
標籤:MySQL
上一篇:android連接mysql
下一篇:mysql 條件按照條件逐級匹配
