WITH student AS
(
SELECT '001' s_id, '기민용' s_nm FROM dual
UNION ALL SELECT '002', '이현석' FROM dual
UNION ALL SELECT '003', '김정식' FROM dual
UNION ALL SELECT '004', '강정식' FROM dual
)
, course AS
(
SELECT '001' c_id, 'Database' c_nm FROM dual
UNION ALL SELECT '002', 'Java' FROM dual
)
, study AS
(
SELECT '001' s_id, '001' c_id, 1 chasu FROM dual
UNION ALL SELECT '001', '001', 3 FROM dual
UNION ALL SELECT '001', '002', 2 FROM dual
UNION ALL SELECT '002', '001', 1 FROM dual
UNION ALL SELECT '002', '001', 2 FROM dual
UNION ALL SELECT '002', '001', 3 FROM dual
UNION ALL SELECT '003', '002', 1 FROM dual
UNION ALL SELECT '003', '002', 2 FROM dual
UNION ALL SELECT '004', '001', 1 FROM dual
)
select case when c_id = '001' then s_id end as "ID"
,case when c_id = '001' then s_nm end as "성명"
,c_nm as "스터디"
,max(chasu1) as "1차"
,max(chasu2) as "2차"
,max(chasu3) as "3차"
,count(c_id) as "참여횟수"
from (
select a.s_id
,a.s_nm
,b.c_id
,b.c_nm
,decode(c.chasu,1,'O') chasu1
,decode(c.chasu,2,'O') chasu2
,decode(c.chasu,3,'O') chasu3
from student a cross join
course b LEFT OUTER JOIN
study c
on a.s_id = c.s_id
and b.c_id = c.c_id
)
group by s_id,s_nm,c_id,c_nm
order by s_id,c_id
WITH student AS
(
SELECT '001' s_id, '기민용' s_nm FROM dual
UNION ALL SELECT '002', '이현석' FROM dual
UNION ALL SELECT '003', '김정식' FROM dual
UNION ALL SELECT '004', '강정식' FROM dual
)
, course AS
(
SELECT '001' c_id, 'Database' c_nm FROM dual
UNION ALL SELECT '002', 'Java' FROM dual
)
, study AS
(
SELECT '001' s_id, '001' c_id, 1 chasu FROM dual
UNION ALL SELECT '001', '001', 3 FROM dual
UNION ALL SELECT '001', '002', 2 FROM dual
UNION ALL SELECT '002', '001', 1 FROM dual
UNION ALL SELECT '002', '001', 2 FROM dual
UNION ALL SELECT '002', '001', 3 FROM dual
UNION ALL SELECT '003', '002', 1 FROM dual
UNION ALL SELECT '003', '002', 2 FROM dual
UNION ALL SELECT '004', '001', 1 FROM dual
)
select case when c_id = '001' then s_id end s_id
,case when c_id = '001' then s_nm end s_nm
,c_nm
,max(chasu1) chaus1
,max(chasu2) chaus2
,max(chasu3) chaus3
,count(c_id) cnt
from (
select a.s_id
,a.s_nm
,b.c_id
,b.c_nm
,decode(c.chasu,1,'O') chasu1
,decode(c.chasu,2,'O') chasu2
,decode(c.chasu,3,'O') chasu3
from student a cross join
course b LEFT OUTER JOIN
study c
on a.s_id = c.s_id
and b.c_id = c.c_id
)
group by s_id,s_nm,c_id,c_nm
order by s_id,c_id
위의 쿼리문을 보면 alias의 명칭만 틀립니다. 하지만 결과값은 정 반대로 나오네요.... 이유좀 설명해주실수 있으실까요???
SQL 구문의 실행되는 순서를 알면 답이 보입니다.
SQL의 실행순서는 다음과 같습니다.
SELECT ----- ⑤
FROM ----- ①
WHERE ----- ②
GROUP BY -- ③
HAVING ----- ④
ORDER BY -- ⑥
1단계 From 절에서 사용된 알리아스는 2단계 이후 어디서나 사용 가능하구요
5단계 Select 절에서 사용된 알리아스는 Order By 절에서만 사용가능합니다.
이전 단계어서는 사용이 불가능 하구요.
사용하신 정렬구문 ORDER BY s_id, c_id 에서
s_id 와 c_id 는 Select 구문에서 사용된 별칭을 의미합니다.
따라서 원본과 같은 정렬결과를 얻으시려면 다음과 같이 하셔야 합니다.
SELECT ...
FROM (서브쿼리) x
GROUP BY ...
ORDER BY x.s_id, x.c_id
;
2번 쿼리에서 Select 절에
case when c_id = '001' then s_id end s_id 와 같이 별칭을 주었지요.
빨간색 s_id 는 본래의 s_id 이고 파란색은 별칭을 준 s_id 입니다.
ORDER BY s_id 에서 s_id 가 무었인지만 인지하시면 됩니다. 파란색이겠죠.
하지만
1번 쿼리에서 Select 절에
case when c_id = '001' then s_id end "ID" 와 같이 별칭을 주었지요.
ORDER BY s_id 에서 s_id 가 무었인지만 인지하시면 됩니다. 빨간색이겠죠.
1번쿼리와 2번쿼리의 정렬구문에서 사용한 s_id 가 서로 다르다는것을 인지하셔야 합니다.