SELECT
A.USRID,
SUM(D.LEAN_TCNT) TCNT,
C.SJ_CD,
C.CRS_YEAR
FROM
TLMS_STUDENT A
INNER JOIN TLMS_CRSSEQ B
ON A.CRSSEQ_ID = B.CRSSEQ_ID
INNER JOIN TLMS_CRS C
ON C.CRSCD = B.CRSCD
INNER JOIN (
SELECT CRS_NM, TOT_TCNT, ROUND(SUM(CNT/S_LSSN_CNT)*2) AS LEAN_TCNT, CRSSEQ_ID FROM (
SELECT CRS_NM, TOT_TCNT, CRSSEQ_ID, S_LSSN_CNT,
CASE WHEN S_LSSN_CNT = S_LSSN_CMPL_CNT THEN 1
ELSE 0
END CNT
FROM (
SELECT A.CRS_NM
, A.CRSSEQ_ID
, (SELECT COUNT(*) * 2 FROM TLMS_LSSN WHERE DEPTH = 2 AND CRSCD = A.CRSCD) AS TOT_TCNT
, COUNT(A.LSSN_CD) OVER(PARTITION BY A.L_LSSN_CD) AS S_LSSN_CNT
, SUM(DECODE(LR.CMPLTN_YN,'Y',1,0)) OVER(PARTITION BY A.L_LSSN_CD) AS S_LSSN_CMPL_CNT
FROM (
SELECT S.STUDENT_ID
, S.CRSSEQ_ID, CS.CRSCD, C.CRS_NM
, S.USRID
, L.LSSN_CD
, L2.LSSN_CD AS L_LSSN_CD
, L.CONTSID, L.ITEMID, L.UPITEMID
, L2.LSSN_NM AS L_LSSN_NM
, L.LSSN_NM AS S_LSSN_NM
FROM TLMS_STUDENT S
, TLMS_CRSSEQ CS
, TLMS_CRS C
, TLMS_LSSN L -- 소주제정보
, TLMS_LSSN L2 -- 회차정보
WHERE S.CRSSEQ_ID = CS.CRSSEQ_ID
AND CS.CRSCD = C.CRSCD
AND CS.CRSCD = L.CRSCD
AND L.CRSCD = L2.CRSCD
AND L.CONTSID = L2.CONTSID
AND L.UPITEMID = L2.ITEMID
AND S.USRID = 사용자 아이디 <------------------------- 해당 부분 대신 전체 유저 테이블과 조인을 걸어서 마지막에 사용자 아이디를 걸면 결과가 다르게 나옴
AND S.STUDENT_STCD = '03'
AND L.DEPTH = 3
AND L.SUB_THEMA_TY = 'V'
) A
, TLMS_LSSN_RSLT LR
, TCMS_ITEM I
WHERE A.STUDENT_ID = LR.STUDENT_ID(+)
AND A.CRSCD = LR.CRSCD(+)
AND A.LSSN_CD = LR.LSSN_CD(+)
AND A.CONTSID = I.CONTSID
AND A.ITEMID = I.ITEMID
AND I.SUB_THEMA_TY IS NOT NULL
)
)
GROUP BY CRS_NM, TOT_TCNT, CRSSEQ_ID
) D
ON B.CRSSEQ_ID = D.CRSSEQ_ID
WHERE A.USRID = 사용자 아이디
GROUP BY A.USRID, C.SJ_CD, C.CRS_YEAR
ORDER BY A.USRID, SJ_CD ASC
여러개 조인을 해서 결과를 뽑아내는 쿼리인데
가장 안쪽(?) 쿼리에서 특정 사용자를 조건을 걸면 조회가 잘 나오는데
우선 전체로 뽑아서 가장 마지막에 걸거나
그냥 조건 안 걸로 전체 조회 후 엑셀로 받아서 그 사용자만 검색해보면 값이 다르게 출력이 되는데
이건 구조 자체가 문제일까요..?
정말 사소한 팁이라도 부탁드려요ㅜ
아래 이미지는 정상출력 값이고
틀리게 나오는 값은 어떤 학습자를 조회해도 TCNT가 0으로 나오고 있습니다.
쿼리를 안보고 문제를 파악하긴 힘들죠.
쿼리를 첨부하긴 했는데 혹시 한번만 봐주실수있을까요?
결과가 어떻게 다른지도 보여주세요.
사용자별로 나와야 한다면?
카운트 구하는 분석함수의 PARTITION BY 부분에 사용자ID 가 포함되어야 하지 않을까요?
감사합니다 ㅜㅜ
너무 무지했네요 더 공부해보겠습니다ㅜㅎ
아! 한번 말씀해주신대로 해보도록 하겠습니당!
쿼리를 보면 불필요한 부분이 너무 많네요.
꼭 필요한 것만 남기고 필요없는 부분은 제거하셔야 합니다.
그렇군요.. ㅜ 충고 감사합니다.
한번 머리 싸매고 고민해보겠습니다
불필요해 보이는 부분
1. tot_tcnt 구하는 서브쿼리
- 최종 결과에서 사용 안함
2. 사용되지 않는 항목
- lssn_nm
3. tcms_item i 테이블 조인
- 조인은 하고 있으나 아래 조건 하나 빼고는 사용되고 있지 않음
- i.sub_thema_ty IS NOT NULL 이 조건이 결과에 영향을 미치는 조건이 맞는지?
4. 메인 정보와 d 와의 조인
- 같은 테이블을 두번 사용하고 있으므로
- 한번만 사용하여 d 조인 없이 해결 가능할 것으로 보임
아 저 쿼리 자체는 사용하는 쿼리였고 최근에 다른 이유로 인해 일회용으로 다른 용도로 써야하는 이유가 생겨서 쿼리를 좀 수정중인데 급하게 하다보니 불필요한걸 지워야겠다는 생각을 놓쳤던거 같습니다. 4번의 경우는 잘 생각해보면 기존 쿼리도 좀 간략해질거 같아서 확인을 해봐야 겠네요 ㅎㅎ 조언 너무나 감사드립니다!!