iT邦幫忙

0

sql 查詢

sql
YJ 2020-10-15 16:44:33940 瀏覽

爬蟲爬出了資料放置資料庫,想抓南部工作薪資平均但workpay有文字要濾掉文字這樣sql要如何寫,條件式以最高薪判斷值電子相關在(高雄、台南)

address        industry           workpay   
高雄市岡山區    電子工程相關       月薪37,000~42,000元
高雄市新興區    電子儀器相關       待遇面議
高雄市苓雅區    餐廳服務相關       月薪26,000~35,000元
高雄市岡山區    電子資訊相關       月薪37,000~55,000元
台北市信義區    電子工程相關       月薪37,000~55,000元
台南市新營區    電子工程相關       待遇面議
0
浩瀚星空
iT邦超人 1 級 ‧ 2020-10-15 17:16:42

一般建議是寫正則來處理。

只是你的資料情況,條件並不太好寫。
還是會建議你拉出來用程式跑。

用sql來跑正則拉條件的話。會有點難度就是了。

如果可以在爬蟲時寫入資料就會正則來做區分後,另開欄位存薪水值。
這樣你要查尋時才好做處理。要邊處理邊做max搜尋是有點難度了。

YJ iT邦新手 5 級 ‧ 2020-10-15 21:24:11 檢舉

謝謝?感恩,濾掉在來下sql試試

0
賽門
iT邦超人 1 級 ‧ 2020-10-15 17:18:41

我想建議你改一下爬蟲程式,
把WorkPayd欄位改成兩欄: WorkPay_Min, WorkPay_Max
然後把例如"月薪37,000~42,000元"這樣子的結果, 再過濾調整為
WorkPay_Min放37,000
WorkPay_Max放42,000

接下來SQL就好寫多了.
這個可以查出高薪在那個行業, 在什麼地區...
Select Address, Industrial, Max(WorkPay_Max) from Table Group By Address, Industrial;
這個可以查出最高薪資那個地區那個行業...
Select Address,Industrial,WorkPay_Max from [Table] where WorkPay_Max = (Select Max(WorkPay_Max) from [Table])
其實待遇面議的, 有可能高薪更高, 所以這調查也只是參考而己.

賽門 iT邦超人 1 級 ‧ 2020-10-15 17:25:35 檢舉

最近好像和樓上那位巴斯光年很有緣,老是貼文在其後。
巴斯光年台詞: 飛向宇宙, 浩瀚無垠~ 呵呵

YJ iT邦新手 5 級 ‧ 2020-10-15 21:23:38 檢舉

謝謝?,在濾一下試試,在下sql。可以一起組宇宙隊了

1
純真的人
iT邦高手 1 級 ‧ 2020-10-15 18:08:08

這個...玩一下~不曉得是否是這樣~

declare @a table(
	[address] nvarchar(50)
	,[industry] nvarchar(50)
	,[workpay] nvarchar(50)
)

insert into @a
values(N'高雄市岡山區',N'電子工程相關',N'月薪37,000~42,000元')
,(N'高雄市新興區',N'電子儀器相關',N'待遇面議')
,(N'高雄市苓雅區',N'餐廳服務相關',N'月薪26,000~35,000元')
,(N'高雄市岡山區',N'電子資訊相關',N'月薪37,000~55,000元')
,(N'台北市信義區',N'電子工程相關',N'月薪37,000~55,000元')
,(N'台南市新營區',N'電子工程相關',N'待遇面議')

select [address]
,[industry]
,max([workpay]) [workpay]
from @a
where (1=2
	or [address] like N'高雄%'
	or [address] like N'台南%'
)
and (1=2
	or [industry] like N'電子%'
)
and (1=2
	or [workpay] like N'%[0-9]%'
)
group by [address]
,[industry]

https://ithelp.ithome.com.tw/upload/images/20201015/200613697x3B3rzlG1.png

修改2

DECLARE @str nvarchar(max)
DECLARE @expres  VARCHAR(50) = '%[^0-9]%'

select @str=min([workpay])
from @a
where (1=2
	or [address] like N'高雄%'
	or [address] like N'台南%'
)
and (1=2
	or [industry] like N'電子%'
)
and (1=2
	or [workpay] like N'%[0-9]%'
)
set @str = left(@str,CharIndex('~', @str ))

while PatIndex( @expres, @str ) > 0
SET @str = Replace( @str, Substring( @str, PatIndex( @expres, @str ), 1 ),'')
SELECT @str workpay

https://ithelp.ithome.com.tw/upload/images/20201016/200613690u0q8Ajs7E.png

還是你想要純SQL??

select (
	select '' + NumStr
	from (
		select (case when isNumeric(Substring( y,Sort, 1 )) > 0 then Substring( y,Sort, 1 ) else '' end) as NumStr
		from (
			select Row_Number()Over(order by [number]) as Sort
			from master..spt_values
		) as k
		,(
			select Left([y],CharIndex('~',[y])) [y]
			from (
				select min([workpay]) [y]
				from @a
				where (1=2
					or [address] like N'高雄%'
					or [address] like N'台南%'
				)
				and (1=2
					or [industry] like N'電子%'
				)
				and (1=2
					or [workpay] like N'%[0-9]%'
				)
			) k
		) k2
		where Sort <= Len(y)
	) k
	where NumStr <> ''
	for xml path('')
) workpay

https://ithelp.ithome.com.tw/upload/images/20201016/20061369MzTTE08seY.png

看更多先前的回應...收起先前的回應...
YJ iT邦新手 5 級 ‧ 2020-10-15 21:17:12 檢舉

不是耶,值要的是薪資平均喔

YJ
那可以把你要的結果弄出畫面來嗎?
這樣我才知道你最終樣子~

YJ iT邦新手 5 級 ‧ 2020-10-15 21:29:13 檢舉

結果是要單值喔,所有列最低薪資在(台南、高雄)sum的平均喔

這個還是請你用畫圖表示顯示結果吧@@...用文字可能會誤解你的意思~

YJ iT邦新手 5 級 ‧ 2020-10-16 08:29:03 檢舉

要的答案是這個喔,感恩/images/emoticon/emoticon07.gif
workpay
37,000

YJ
所以是這個修改所示@@?
https://ithelp.ithome.com.tw/upload/images/20201016/20061369k1OfmD75oY.png

YJ iT邦新手 5 級 ‧ 2020-10-16 19:48:18 檢舉

/images/emoticon/emoticon02.gif不好意思,我在看一下,有點看不太懂您寫ㄉ

的確有點複雜...
就像浩瀚星空所說的~
一開始結構沒弄好~
後面SQL就超麻煩~@@

或者你要不要改一下你的資料結構~
新增兩個欄位記錄最小跟最大~
把原來資料複製到新欄位~
對查詢來說~會比較簡單~

我要發表回答

立即登入回答