쿼리 결과 조회 관련 질문 드립니다ㅜ (쿼리 추가) 0 10 4,298

by zumsim [Tibero] tibero 부분조회 전체조회 [2024.04.18 10:26:48]


정상.png (6,821Bytes)

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으로 나오고 있습니다.

by 마농 [2024.04.18 10:59:19]

쿼리를 안보고 문제를 파악하긴 힘들죠.


by zumsim [2024.04.18 11:13:27]

쿼리를 첨부하긴 했는데 혹시 한번만 봐주실수있을까요?


by 마농 [2024.04.18 11:17:10]

결과가 어떻게 다른지도 보여주세요.


by 마농 [2024.04.18 11:27:37]

사용자별로 나와야 한다면?
카운트 구하는 분석함수의 PARTITION BY 부분에 사용자ID 가 포함되어야 하지 않을까요?


by zumsim [2024.04.18 11:32:43]

아! 한번 말씀해주신대로 해보도록 하겠습니당!


by zumsim [2024.04.18 11:41:43]

감사합니다 ㅜㅜ 

너무 무지했네요 더 공부해보겠습니다ㅜㅎ


by 마농 [2024.04.18 13:12:14]

쿼리를 보면 불필요한 부분이 너무 많네요.
꼭 필요한 것만 남기고 필요없는 부분은 제거하셔야 합니다.


by zumsim [2024.04.18 14:11:51]

그렇군요.. ㅜ 충고 감사합니다.

한번 머리 싸매고 고민해보겠습니다


by 마농 [2024.04.18 16:42:10]

불필요해 보이는 부분
1. tot_tcnt 구하는 서브쿼리
- 최종 결과에서 사용 안함
2. 사용되지 않는 항목
- lssn_nm 
3. tcms_item i 테이블 조인
- 조인은 하고 있으나 아래 조건 하나 빼고는 사용되고 있지 않음
- i.sub_thema_ty IS NOT NULL 이 조건이 결과에 영향을 미치는 조건이 맞는지?
4. 메인 정보와 d 와의 조인
- 같은 테이블을 두번 사용하고 있으므로
- 한번만 사용하여 d 조인 없이 해결 가능할 것으로 보임


by zumsim [2024.04.18 17:35:05]

아 저 쿼리 자체는 사용하는 쿼리였고 최근에 다른 이유로 인해 일회용으로 다른 용도로 써야하는 이유가 생겨서 쿼리를 좀 수정중인데 급하게 하다보니 불필요한걸 지워야겠다는 생각을 놓쳤던거 같습니다. 4번의 경우는 잘 생각해보면 기존 쿼리도 좀 간략해질거 같아서 확인을 해봐야 겠네요 ㅎㅎ 조언 너무나 감사드립니다!!

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