sql 질문있습니다2 0 2 735

by 김동훈 [SQL Query] [2021.01.05 19:44:56]


pajama, 마농님 답변 감사드립니다.

 

id level power
1 10 100
2 20 200
3 30 300
4 40 400
5 50 500
6 60 600
7 70 700
8 80 800
9 90 900
10 100 1000

 

level 30이상 id의 power 평균(id 8개)

level 50이상 id의 power 평균(id 6개)

div_level avg_power
30이상 650
50이상 750

union all, pivot 없이 가능할까요?

 

http://www.gurubee.net/article/83881

마농님이 답변 주신 SUM(COUNT(*)) OVER(ORDER BY div_value) 이게 누적 합을 구하는 거 같은데

저거랑 비슷하게 짜보려 했는데 제대로 이해를 못 했는지 쉽지 않네요 ㅠ

by pajama [2021.01.06 02:18:26]

어떻게 만들긴 했는데..^^; 다른 방법이 있을것도 같고..

with t as (
select 1 id, 10 lv, 100 power from dual union all
select 2, 20, 200 from dual union all
select 3, 30, 300 from dual union all
select 4, 40, 400 from dual union all
select 5, 50, 500 from dual union all
select 6, 60, 600 from dual union all
select 7, 70, 700 from dual union all
select 8, 80, 800 from dual union all
select 9, 90, 900 from dual union all
select 10, 100, 1000 from dual
)
select case when a.div_level is null then b.div_level else a.div_level end div_level,
       case when a.avg_power is null then b.avg_power else a.avg_power end avg_power
from (select '30이상' div_level, avg(power) avg_power from t where lv >= 30) a
     full outer join (select '50이상' div_level, avg(power) avg_power from t where lv >= 50) b on a.div_level = b.div_level

 


by 마농 [2021.01.06 08:04:56]

level 이나 power 와 같은 예약어를 명칭으로 사용하는 것은 좋지 않습니다. 다른명칭을 사용하세요.
union all, unpivot 등을 사용하지 말아야 한다는 제약을 두는 것은 좋지 않습니다.
해당 제약으로 인해 더 좋은 답변을 달지 못할 수도 있습니다.
지난번 답변을 보면 union all 은 사용이 안되었던데요?
with 문 안의 union all 을 일일이 기술해 줘야 한다고 오해하신 듯 하네요.
with 문은 테스트용 보조역할을 할 뿐입니다. 중요한게 아닙니다. with 문 아래쪽 쿼리문의 작성 스타일을 보세요.

WITH t AS
(
SELECT 1 id, 10 lv, 100 pw FROM dual
UNION ALL SELECT  2,  20,  200 FROM dual
UNION ALL SELECT  3,  30,  300 FROM dual
UNION ALL SELECT  4,  40,  400 FROM dual
UNION ALL SELECT  5,  50,  500 FROM dual
UNION ALL SELECT  6,  60,  600 FROM dual
UNION ALL SELECT  7,  70,  700 FROM dual
UNION ALL SELECT  8,  80,  800 FROM dual
UNION ALL SELECT  9,  90,  900 FROM dual
UNION ALL SELECT 10, 100, 1000 FROM dual
)
SELECT a.lv || '이상' div_level
     , AVG(b.pw) avg_power 
  FROM (SELECT 30 lv FROM dual
        UNION ALL SELECT 50 FROM dual
        ) a
     , t  b
 WHERE a.lv <= b.lv
 GROUP BY a.lv
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입