iT邦幫忙

0

[Oracle] 這個查詢結果哪裡有問題....幫幫忙!!!!

有三個表格,分別為監測站(STATION)、監測器(SENSOR)、環境暴露資料(RISKDATA)
關聯圖如下:
https://imgur.com/DNQAn7V
https://imgur.com/87Z1z2V

問題:試從既有的資料裡計算各監測站的二氧化硫平均濃度,列出各測站之監測站名稱NODE_NAME與平均濃度 AVG(ENV_CONS)

我是這樣打的,請問哪裡有錯
select node_name, avg(env_cons)"AVG_CONS"
from station s,riskdata r
where s.node_id=r.node_id
and s.node_id in
(SELECT NODE_ID FROM riskdata
GROUP BY NODE_ID)
ORDER BY "AVG_CONS" DESC;

PS:
SEN_NAME為二氧化硫分析儀

有二氧化硫分析儀的測站分別為(以SEN_NUM;NODE_ID 表示之):

  1. T02;S001
  2. T04;S002
  3. T12;S004

而查詢的結果應包括RISKDATA中的(ENV_NUM;ENV_CONS;SEN_NUM ;NODE_ID):

  1. E02;50;T02;S001
  2. E05;82;T04;S002
  3. E09;220;T04;S002
  4. E21;861;T12;S004

而以上的答案必須ORDER BY監測站的AVG(ENV_CONS)

拜託各位幫忙~~~
小妹由衷感恩您~~~~~

2 個回答

0
listennn08
iT邦高手 8 級 ‧ 2019-05-30 17:35:35
Select station.node_id,station.node_name , s.sen_func, r.avg_cons from 
	(Select s.node_id, s.sen_func, r.avg_cons from
		(Select node_id, avg(env_cons) as avg_cons from riskdata group by node_id)r , sensor s
		 where s.sen_func = '二氧化硫分析儀' and r.node_id = s.node_id) ss, station
	where station.node_id = ss.nodeid
	order by r.avg_cons desc

練習一下 不知道這樣是不是可以QQ

看更多先前的回應...收起先前的回應...
miyokoya iT邦新手 5 級 ‧ 2019-05-30 17:43:31 檢舉

無法耶~而且我上面打得HAVING部分是錯的,因為沒給SEN_NUM,必ㄒㄩ,必須單靠指令查詢出答案

妳的order by 的AVG_CONS放錯位置了 妳放在子查詢裡面可是妳的AVG_CONS是在外面的select

miyokoya iT邦新手 5 級 ‧ 2019-05-30 17:52:58 檢舉

恩恩我有發現~可是我改過後~變這樣
https://imgur.com/1dwr6Hn

用avg(env_cons) as AVG_CONS也一樣耶

miyokoya iT邦新手 5 級 ‧ 2019-05-30 18:01:35 檢舉

改成這樣後還是不行耶
select node_name, avg(env_cons)
from
(SELECT NODE_NAME,ENV_CONS
FROM RISKDATA
LEFT JOIN SENSOR ON SENSOR.NODE_ID=RISKDATA.NODE_ID AND SENSOR.SEN_NUM=RISKDATA.SEN_NUM
LEFT JOIN STATION ON STATION.NODE_ID=SENSOR.NODE_ID
WHERE 1=1
AND SENSOR.SEN_NAME='二氧化硫分析儀')
order by node_name;

妳把avg放裡面有group by的子查詢 再外面在用order by 排序

miyokoya iT邦新手 5 級 ‧ 2019-05-30 18:49:16 檢舉

還是不行耶~~>~<

那就是妳要先篩選出二氧化硫的檢測站 再用avg group by 算出平均 再排序

miyokoya iT邦新手 5 級 ‧ 2019-05-30 20:46:01 檢舉

謝謝~~
感恩~~

0
rogeryao
iT邦高手 1 級 ‧ 2019-05-30 20:12:31
SELECT TEMPTABLE.AVGField,TEMPTABLE.NODE_ID,TEMPTABLE.NODE_NAME,RISKDATA.SEN_NUM ,
RISKDATA.ENV_CONS,RISKDATA.ENV_NUM
FROM (
SELECT STATION.NODE_ID,STATION.NODE_NAME,
AVG(RISKDATA.ENV_CONS) OVER(PARTITION by RISKDATA.NODE_ID) as AVGField
FROM RISKDATA
LEFT JOIN SENSOR ON SENSOR.NODE_ID=RISKDATA.NODE_ID AND SENSOR.SEN_NUM=RISKDATA.SEN_NUM
LEFT JOIN STATION ON STATION.NODE_ID=SENSOR.NODE_ID
WHERE 1=1
AND SENSOR.SEN_NAME='二氧化硫分析儀'
) "TEMPTABLE"
LEFT JOIN RISKDATA ON RISKDATA.NODE_ID=TEMPTABLE.NODE_ID
WHERE 1=1 
ORDER BY TEMPTABLE.AVGField DESC,TEMPTABLE.NODE_ID,RISKDATA.SEN_NUM

以上程式碼未實測

miyokoya iT邦新手 5 級 ‧ 2019-05-30 20:45:32 檢舉

謝謝~
感恩~~

我要發表回答

立即登入回答