이른 아침부터 궁금한 점이 있습니다 ㅠㅠ 0 7 1,873

by 스파이 [SQL Query] [2015.08.12 09:12:38]


몇일전에도 한번 올렸던 내용인데...

다른일과 겹쳐서 진행중이다 보니 아직도 해결을 못하고 있네요 ㅠㅠ

 

SELECT 구
       ,SUM(tot) AS tot
       ,SUM(시봉) AS 시봉
       ,SUM(재봉) AS 재봉
       ,SUM(전봉) AS 전봉
       ,SUM(지사) AS 지사
       ,SUM(헌) AS 헌
       ,SUM(기) AS 기
FROM( SELECT CASE WHEN AGE < 20 AND SEXDIV = 'F' THEN '10대이하여자'
                  WHEN AGE < 20 AND SEXDIV = 'M' THEN '10대이하남자'
                  WHEN AGE BETWEEN 20 AND 29 AND SEXDIV = 'F' THEN '20대여자'
                  WHEN AGE BETWEEN 20 AND 29 AND SEXDIV = 'M' THEN '20대남자'
                  WHEN AGE BETWEEN 30 AND 39 AND SEXDIV = 'F' THEN '30대여자'
                  WHEN AGE BETWEEN 30 AND 39 AND SEXDIV = 'M' THEN '30대남자'
                  WHEN AGE BETWEEN 40 AND 49 AND SEXDIV = 'F' THEN '40대여자'
                  WHEN AGE BETWEEN 40 AND 49 AND SEXDIV = 'M' THEN '40대남자'
                  WHEN AGE BETWEEN 50 AND 59 AND SEXDIV = 'F' THEN '50대여자'
                  WHEN AGE BETWEEN 50 AND 59 AND SEXDIV = 'M' THEN '50대남자'
                  WHEN AGE >= 60 AND SEXDIV = 'F' THEN '60대이상여자'
                  WHEN AGE >= 60 AND SEXDIV = 'M' THEN '60대이상남자'
                  END AS 구
             ,tot
             ,시봉
             ,재봉
             ,전봉
             ,지사
             ,헌
             ,기
        FROM( SELECT FNGETAGE(b.RESPSNO) AS AGE
                     ,b.SEXDIV
                     ,COUNT(*) AS tot,
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '01' THEN 1 ELSE 0 END) 시봉, 
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '02' THEN 1 ELSE 0 END) 재봉,
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '03' THEN 1 ELSE 0 END) 전봉
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '04' THEN 1 ELSE 0 END) 지사, 
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '07' THEN 1 ELSE 0 END) 헌,
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) NOT IN ('01','02','03','04','07') OR A.ACTTYPE IS NULL THEN 1 ELSE 0 END) 기
                FROM resactres_blood_2014 A,RESMST_2014 B
               WHERE A.RESNO = B.RESNO(+)
              GROUP BY FNGETAGE(b.RESPSNO), b.SEXDIV
            )
       )
GROUP BY 구 ORDER BY 구

 

위의 쿼리를 돌리면

     202242    7    0    0    0    202209    26

이런 데이터가 나오는데

제가 원하는 데이터는

 

SELECT 
COUNT(*) AS tot,
SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '01' THEN 1 ELSE 0 END) 시봉, 
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '02' THEN 1 ELSE 0 END) 재봉, 
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '03' THEN 1 ELSE 0 END) 전봉, 
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '04' THEN 1 ELSE 0 END) 지사, 
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) = '07' THEN 1 ELSE 0 END) 헌, 
                     SUM(CASE WHEN SUBSTR(A.ACTTYPE,1,2) NOT IN ('01','02','03','04','07') OR A.ACTTYPE IS NULL THEN 1 ELSE 0 END) 기
                FROM (select resno, ACTTYPE from resactres_blood_2014 where rescentarea='0100') A, 
                      --(select FNGETAGE(RESPSNO) AS AGE, SEXDIV, resno  from RESMST_2014)B
                      RESMST_2014 B
               WHERE A.RESNO = B.RESNO(+)

 

202258    7    0    0    0    202225    26 

이 쿼리를 돌리면 나오는데...

위에 쿼리와 밑의 쿼리의 차이는 

 GROUP BY FNGETAGE(b.RESPSNO), b.SEXDIV

이 구문 이거든요... 데이터 빠지는 부분 없이 위의 형식대로 뽑을 수 있을까요?

 

 

by 거제도원주민 [2015.08.12 14:15:56]

답이 될런지요.

일단 위의 구문을 살펴보면 

WHERE A.RESNO = B.RESNO(+)

GROUP BY FNGETAGE(b.RESPSNO), b.SEXDIV 에서

FNGETAGE는 평균값을 얻는 FUNCTION같고 ...

 

B.RESNO(+)라는 것은 A.RESNO에는 존재하지만 B.RESNO(+)에는 존재하지 않을수있다는 전제이잖아요. 그래서 B.RESNO(+)에 있는것만 GROUP BY FNGETAGE(b.RESPSNO) 하니까 값이 맞지않을거 같구요. 만약 A와 B가 일대일이라면 동일하게 나오지 않을까요?

 

아래의 경우는 GROUP BY 하지 않으니까 A.RESNO 기준으로  FNGETAGE(b.RESPSNO)를 가져오니 그런거 같은데....

 

짧은 소견입니다... 다른 이유가 있으면????


by 스파이 [2015.08.12 16:51:25]

A.resno의 데이터를 가져오게 되면 정상적으로 나와야 합니다 ㅠㅠ

그래서 B에는 데이터가 없더라도 무조건 A에 맞춰 나오게끔 잡은건데...

하아... group by 하면서 뭔가 빠지는건지... 병합을 하는건지... ㅠㅠ


by 마농 [2015.08.13 07:18:42]

b 의 나이와 성별로 구분을 만들었는데...
b 를 아우터 조인 했으니 나이나 성별이 널인 자료가 존재할 수 있겠죠.
b 에 없는 자료의 구분값이 널이 나오겠네요.
구분값이 널인 자료를 확인하세요.


by 스파이 [2015.08.13 09:08:42]

SELECT * FROM RESMST_2014 WHERE SEXDIV is null

SELECT * FROM RESMST_2014 WHERE RESPSNO is null

로 조회를 해도 나오는 데이터가 없습니다 ㅠㅠ...


by 스파이 [2015.08.13 09:13:48]

group by를 둘 중에 하나만 걸어도...

원하는 값이 안나오네요;;; 이... 이게 뭔일인지... ㅠㅠ

 


by 마농 [2015.08.13 10:19:59]

한쪽 테이블만 확인하셨네요.

아우터 조인 결과를 확인하세요.


by 거제도원주민 [2015.08.13 09:14:05]

위의  마농님께서 잘 설명하신거 같구요. 조금만 더 추가 설명드리면요...

SELECT DISTINCT A.RESNO FROM A

SELECT DISTINCT B.RESNO FROM B 를 하여 비교해 보시기 바랍니다.

데이타 발생기준으로 A TABLE에는 데이타가 발생하였는데 B TABLE에는 발생하지 않았을수가 있다는거죠

 

예를들어 A 테이블에 코드가 10가지로 되어 있는데 B TABLE에는 9가지 밖에 발생안되었을때

위의  GROUP BY FNGETAGE(b.RESPSNO) 했을때는 당연히 9개의 코드를가지고 GROUP BY 할테니까요. 만약 A TABLE에 컬럼이 RESPSNO이 있다면 GROUP BY FNGETAGE(A.RESPSNO) 하면 문제가 없을거 같은데...(가정입니다.) ...

빨리 해결이 되었으면 합니다. ^^

 

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