반응형

마스터 테이블을 A라고 한다면,

SN 과 ROTN 을 PK 로 가지고 있고, 다른 컬럼들이 존재한다고 하자. 이 컬럼들을 서브 테이블이 FK로 가지고 있다.

서브테이블을 B라고 한다면,

B테이블은 A테이블의 SN과 ROTN 컬럼을 참조하고있다. 

하지만, A 테이블에는 있고, B테이블에는 없는 경우가 있다.

내가 원하는 결과는 B에 있으면 있는 row의 카운트를. 없으면 0 이라고 나오는걸 원했다. 

처음에는 inner join 을 이용했는데. 생각해보니 그렇게 한다는건, 가정이 on 에 넣은 컬럼들이 A테이블, B테이블에 일치한 것만 가져오기 때문에. 만약 B 테이블에 없는 값을 조회한다면 count가 0이 아닌, NULL 이 나올 것이다.

오류 쿼리! (INNER JOIN)

SELECT
    if(COUNT(1) >= d.NOPE, 'UNAVAILABLE', 'AVAILABLE') AS availableCheck,
    a.SN,
    a.ROTN
FROM
    info AS a
    INNER join
    dtl AS d
    ON a.SN=d.SN AND a.ROTN=d.ROTN
    GROUP BY a.SN, a.ROTN, d.NOPE

이렇게 했을 때, 두 테이블에 모두 존재하는 애들만 조회가 되었다. 하지만 나는 모든 A에 있는 데이터에 대한 B 테이블 결과를 보고싶은거다!

 

수정한 쿼리!! (RIGHT OUTER JOIN, count(컬럼명))

SELECT
	if(COUNT(a.SN) >= d.NOPE, 'UNAVAILABLE', 'AVAILABLE') AS availableCheck,
	d.SN,
	d.ROTN,
	d.NOPE
FROM
	info AS a
	RIGHT OUTER join
	dtl AS d
	ON a.SN=d.SN AND a.ROTN=d.ROTN
GROUP BY a.SN, a.ROTN, d.NOPE

info (B테이블) 에 없어도 나올 수 있도록, RIGHT OUTER JOIN 을 사용하였고, GROUP BY 는 같다.

여기서 주목할 것은, COUNT 함수에 B테이블에 몇개 있는지를 알고 싶은 것이기때문에, 보통은 count(1) 이렇게 넣어서 항상 생각햇는데, 그건 나의 너무 좁은 생각이었던거다! 왜 컬럼을 넣을 생각을 못했을까.

아무튼, 그래서 COUNT(B테이블컬럼) 을 넣었더니, 원하는 결과가 나왔다!!!!

 

반응형
반응형
SELECT 
	sub.*, 
	ROWNUM AS cntnt 
FROM
	(SELECT 
		WORKER_NAME AS "workerName",
		WORKER_TEL AS "workerTel",
		TIMELINE AS "timeline",
		COMUTE_TYPE AS "commuteType",
		TO_CHAR(TIMELINE, 'YYYY-MM-DD') AS "dateInfo"
	FROM 
		ATTENDANCE_INFO
		WHERE IS_STATISTICS = 0
		GROUP BY TO_CHAR(TIMELINE, 'YYYY-MM-DD'), WORKER_NAME, WORKER_TEL, TIMELINE, COMUTE_TYPE
		ORDER BY WORKER_NAME, TO_CHAR(TIMELINE, 'YYYY-MM-DD')
	) sub

ROWNUM 이라는 컬럼을 사용하면, 순번이 row의 번호가 붙어서 나오게된다.

 

GROUP BY  를 활용해서 조건으로 그룹지어 조회할 수 있다. 여기서 포인트는, 만약 SUM 이런걸 원한다면 select 에 컬럼명으로 sum(원하는 합산의 컬럼명) 으로 적고 group by 조건에는 넣어주지않아도된다. 하지만 다른 표시하고싶은 컬럼들은 모두 group by 에 넣어줘야한다. (이게 mysql 과 다른점이다.)

 

TO_CHAR 을 활용하여, 숫자나 날짜를 원하는 형태로 문자화 시켜서 출력할 수 있다.

쿼리 결과

반응형

 

반응형

+ Recent posts