오라클 쿼리질문이요. 0 11 1,306

by ekekekek [Oracle 기초] [2018.06.11 14:56:54]


TRUNC ((SELECT SUM(R_SECOND) FROM(SELECT R_SECOND, MIN(Q_KEY) FROM RESULT WHERE 1 = 1 AND PID = P.PID AND J_KEY = P.J_KEY GROUP BY R_SECOND)) / 60) ||'분'|| 
       LPAD(ROUND ( MOD ((SELECT SUM(R_SECOND) FROM(SELECT R_SECOND, MIN(Q_KEY) FROM RESULT WHERE 1 = 1 AND PID = P.PID AND J_KEY = P.J_KEY GROUP BY R_SECOND)), 60 ) ),2,'0') ||'초'  AS  ATIME

 INNER JOIN PERSON P
   ON GS.J_ID = P.PID

db테이블에서 데이터를 가져와서 분초단위로 출력하는 작업을 하는 중입니다.

색칠한 부분의 키값을 inner join 한 테이블에서 가져오고 있습니다.

근데 저 해당 키값을 부적합한 식별자라고 출력되는데 어떤식으로 사용해야되나요?

by 우리집아찌 [2018.06.11 15:27:41]

PID가 숫자형인데 문자형으로 질의 하신것 아닌가요?


by ekekekek [2018.06.11 15:29:21]

둘다 문자형인데..부적합하다고 출력이되네요. 


by 마농 [2018.06.11 15:35:53]

쿼리 작성 의도가 불분명합니다.
- MIN(Q_KEY) 는 불필요하게 사용되었네요.
- 한번에 SUM(R_SECOND) 하지 않고 GROUP BY R_SECOND 한 후에 SUM(R_SECOND) 한 이유가 뭘까요?
- R_SECOND 의 중복을 제거하려고 한건가요?
- 키값의 중복을 제거하는 경우는 가끔 있을 수 있지만
- 합산해야 하는 값의 중복을 제거하는 경우는 이상한 경우입니다.
전반적으로 쿼리가 의도에 맞게 작성되었을지 의문입니다.
잘못 작성되었을 가능성이 보입니다.
단순하게 에러를 없애는게 다는 아닐것 같습니다.
쿼리 작성 의도가 무었인지 명확하게 설명해 주세요.


by ekekekek [2018.06.11 15:40:36]

컬럼데이터중에 Q_KEY가 중복 되는 컬럼들이 몇개가 있어서 그 중 가장 작은 Q_KEY의 R_SECOND의 값들을 합쳐서 가져오는 쿼리를 짜고있습니다.


by 마농 [2018.06.11 15:45:39]

설명이 이상한데요?
Q_KEY가 중복 되는 컬럼들이 몇개가 있어서 그 중 가장 작은 Q_KEY???
Q_KEY가 중복된다는 말은 Q_KEY가 같다는 뜻인데? 그중 작은 Q_KEY가 라는 말은 이상하네요.
중복된 자료 예시를 들어주실 수 있나요?


by ekekekek [2018.06.11 15:53:16]

      SECOND     Q_KEY

66    2              66Q1
66    2              66Q2
66    2              66Q3

67    4              67Q1
67    4              67Q2

제가 설명을 잘못드렸네요. 

Q_KEY 위 Q뒤에 1~3까지 붙는 항목들이있습니다. Q_KEY에 상관없이 SECOND는 번호값에 따라 번호값들끼리 모두 일치하는 형태라 Q_KEY를 MIN이나 MAX값으로 GROUP BY절을 사용해서 하나로 묶어서 66, 67의 SECOND를 하나씩으로 추려 SUM값을 구하고 싶습니다.

 

      SECOND     Q_KEY

66    2              66Q1

67    4              67Q1

원하는 데이터 형태입니다. SECOND(SUM) = 6 


by 마농 [2018.06.11 16:09:20]

1. 예시자료의 66, 67 은 별도 항목인가요? 아니면 q_key 의 앞자리 인가요?
2. 스칼라서브쿼리로는 어려울 것 같은데요.
  - 중복 제거 후 SUM 하려면 2단 구조가 되어 버림.
  - 조인으로 바꿀 필요가 있음.
3. 쿼리중에 아래쪽 초계산에 ROUND 를 사용하는 부분이 있는데?
  - 초단위에 소수점도 들어가나요?
  - 소수점이 없다면? 불필요한 부분이구요.
  - 소수점이 있다면? 초뿐만 아니라 분계산에도 동일하게 해줘야 맞습니다.


by ekekekek [2018.06.11 16:16:16]

66 67은 별도 항목입니다.

round는 기존에 있던 시간계산하던 소스를 참고해서 하다보니 입력이되있었는데 불필요한 부분이라 삭제하였습니다.


by 마농 [2018.06.11 16:25:59]

답변이 너무 단답형이네요? ㅡ,.ㅡ
"별도 항목입니다." 로 끝날게 아니라 항목명 정도는 알려주시는게...
혹시 해당 컬럼이 조건 컬럼인 j_key 라면? 스칼라서브쿼리로도 가능합니다.
아니라면 아우터 조인방법으로 바꿔야 할 듯 합니다.


by ekekekek [2018.06.11 16:30:13]

아고 죄송합니다.

모르는 작업을 하려다보니 멘붕이 와서 시간내서 알려주시는 분께 너무 무례한 행동을 했네요.

66, 67 항목은 별도 항목으로 그냥 Q_KEY의 앞번호를 가져다 사용하는 항목입니다.

개발을 시작한지 얼마 안되서..설명을 열심히 해주셨는데..하나하나 검색하면서 테스트 해보고있는데 

알려주신 아우터 조인방법을..찾아서 해봐야될꺼같습니다.

한번더 무례하게 군점 죄송하고 알려주셔서 감사합니다.


by 마농 [2018.06.11 16:37:17]

모호하네요? ㅎ
별도 항목라는 건지? q_key의 앞번호라는 건지?
q_key 의 앞번호로 생각하겠습니다.

SELECT gs.컬럼들
     ,  p.컬럼들
     , FLOOR(s.r_second / 60) ||'분'||
       LPAD(MOD(s.r_second, 60), 2, '0') || '초' AS atime
  FROM ... gs
 INNER JOIN person p
    ON gs.j_id = p.pid
  LEFT OUTER JOIN
       (SELECT pid, j_key
             , SUM(r_second) r_second
          FROM (SELECT DISTINCT pid, j_key, r_second, SUBSTR(q_key, 1, 2) FROM result)
         GROUP BY pid, j_key
        ) s
    ON p.pid   = s.pid
   AND p.j_key = s.j_key
;

 

 

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