데이터가 있으면 카운트에 포함시키기 0 9 843

by xcrew [SQL Query] [2018.03.15 13:50:37]


안녕하세요. 항상 도움 감사하게 생각하는 xcrew 입니다.

 

기존의 쿼리에서 해당하는 컬럼에 값이 있으면 카운에 포함시키고 싶습니다.

SELECT A1.PART_CD
       ,C.YEAR_CNT PALN_CNT
       ,A1.CNT_02
       ,A1.CNT_SUM
       ,ROUND(A1.CNT_SUM/C.YEAR_CNT*100,1) RATE
FROM(
	SELECT A.PART_CD
               ,SUM(DECODE(A.MONTH,'02', A.CNT,0)) CNT_02
               ,SUM(A.CNT) CNT_SUM
		FROM(
		     SELECT A.PART_CD
			,SUBSTR(A.SIL_YMD,5,2) MONTH
                        ,COUNT(*) CNT
		     FROM CT_GIBON A, CT_DONG B
			WHERE A.PART_CD = B.PART_CD
			  AND A.CST_NO =  B.CST_NO
			  AND A.CST_CHG_NO = B.CST_CHG_NO
                          AND A.REG_DATE = B.REG_DATE
                          AND A.SIL_YMD = B.SIL_YMD
                          AND A.SIL_YMD BETWEEN '20180101' AND '20180228'
			  AND SUDANG_YN = 'Y'
		     GROUP BY A.PART_CD, SUBSTR(A.SIL_YMD,5,2)
			)A
		GROUP BY A.PART_CD
	)A1,
	CS_CODE B,
	CM_CTI_PLAN C
WHERE A1.PART_CD = B.CODE_CD
	AND B.USE_YN = 'Y'
	AND B.GROUP_CD = 'TC58'
	AND A1.PART_CD = C.PART_CD
	AND C.YM = '2018'
ORDER BY A1.PART_CD

CT_DONG 이라는 테이블에

DONG_SA1, DONG_SA2, DONG_SA3, DONG_SA4, DONG_SA5, DONG_SA6이라는 테이블에 값이 들어있으면

A1.CNT_02 에 카운트를 추가하여 보여주고 싶습니다.

기존쿼리에서 A1.CNT_02의 값이 10이고

DONG_SA1에 데이터가 있으면 11이 되도록 하려면 어떻게 해야 될까요?

도움 부탁드립니다.

 

 

by 마농 [2018.03.15 14:09:58]

1. 표현들이 모호하네요.
  - 6개 나열한 것이 테이블인가요 컬럼인가요?
  - "값이 들어있으면" 이라는게? 6개가 다 있어야 하는지? 하나만 있어도 되는지?
  - 카운트를 추가하는게? cnt_02 만 추가하나요? cnt_sum 도 추가하나요?
  - 예시 자료를 보여주실 수는 없는지?
  - 두 테이블(ct_gibon a, ct_dong b)의 관계가 어떻게 되나요?


by xcrew [2018.03.15 14:26:54]

- 6개 나열한것이 CT_DONG 에 들어있는 컬럼들 입니다.

- 나열한 6개의 값이 하나도 없을수도 있고 DONG_SA1에만 있을수 있고 DONG_SA2에만 있을 수 있습니다.

- cnt_sum에도 추가가 되어야 합니다.^^

- DONG_SA1 데이터는 965847 이런식으로 들어가 있습니다.

- ct_gibon은 점검내역을 입력하는 테이블이고 ct_dong은 점검내역의 동행자 테이블입니다.

 


by 마농 [2018.03.15 14:28:44]

카운트를 어떻게 추가해야 하는지 예를 들어 주세요.


by xcrew [2018.03.15 14:45:57]

예를들면요

기존 쿼리를 돌리면 part_cd=3100 cnt_02=36 plan_cnt=1035 cnt_02=11 CNT_SUM=239 rate=23.1이 나왔는데요

여기에서 CT_DONG테이블에 컬럼인 DONG_SA1에 123466 값이 들어있으면 카운트 +1 해서

cnt_02=37이 되게 하고싶습니다. 

CNT_02만 되면 될것 같습니다.

CNT_SUM은 안해도 되는거였네요....


by 마농 [2018.03.15 14:53:04]

위의 내용과 다른게 하나도 없네요?
구체적인 내용의 답변을 원한 거였는데요?
있으면 + 1 한다는 내용이 너무 추상적입니다.
그리고, cnt_02 에만 적용한다는건 뜻밖이네요?
일관성이 없는 통계자료는 신뢰성을 잃게 됩니다.


by xcrew [2018.03.15 15:02:38]

원래는 6개의 나열된 컬럼들은

한시적으로 허용을 하게 되어서 부득이 하게 카운트를 해야되는 상황입니다.

그리고 말씀하신대로 CNT_SUM부분도 추가가 되어야 하는게 맞습니다.....ㅠㅠ

구체적인 내용을 설명드리려면 좀 더 고민해봐야 되겠습니다....ㅠㅠ


by 아발란체 [2018.03.15 14:21:06]

찍어서!!

 

SELECT
    A1.PART_CD
   , C.YEAR_CNT PALN_CNT
   , A1.CNT_02
   , A1.CNT_SUM + DECODE(DONG_COMPLEX_SIZE, 0, 0, 1) AS CNT_SUM
   , ROUND(A1.CNT_SUM/C.YEAR_CNT*100,1) RATE
FROM(
    SELECT
        A.PART_CD
        , SUM(DECODE(A.MONTH,'02', A.CNT,0)) CNT_02
        , SUM(A.CNT) CNT_SUM
    FROM (
        SELECT
            A.PART_CD
            , SUBSTR(A.SIL_YMD,5,2) MONTH
            , COUNT(*) CNT,
            LENGTH(TRIM(MAX(B.DONG_SA1||B.DONG_SA2||B.DONG_SA3||B.DONG_SA4||B.DONG_SA5||B.DONG_SA6))) AS DONG_COMPLEX_SIZE
        FROM
            CT_GIBON A, CT_DONG B
        WHERE
            A.PART_CD = B.PART_CD
            AND A.CST_NO =  B.CST_NO
            AND A.CST_CHG_NO = B.CST_CHG_NO
            AND A.REG_DATE = B.REG_DATE
            AND A.SIL_YMD = B.SIL_YMD
            AND A.SIL_YMD BETWEEN '20180101' AND '20180228'
            AND SUDANG_YN = 'Y'
        GROUP BY
            A.PART_CD, SUBSTR(A.SIL_YMD,5,2)
    ) A
    GROUP BY
        A.PART_CD
)A1, CS_CODE B, CM_CTI_PLAN C
WHERE
    A1.PART_CD = B.CODE_CD
    AND B.USE_YN = 'Y'
    AND B.GROUP_CD = 'TC58'
    AND A1.PART_CD = C.PART_CD
    AND C.YM = '2018'
ORDER BY
    A1.PART_CD

 


by 마농 [2018.03.15 14:59:36]
-- 1건의 점검내역이 있을 때, 해당 점검에 대한 동행자가 2명이 있으면 총 3건으로 카운트 한다?
-- 제가 생각한게 맞나요?
-- 맨 안쪽 쿼리만 바꿔 봤습니다.
SELECT a.part_cd
     , SUBSTR(a.sil_ymd, 5, 2) month
     , COUNT(*) cnt_gibon
     , SUM( NVL2(b.dong_sa1, 1, 0)
          + NVL2(b.dong_sa2, 1, 0)
          + NVL2(b.dong_sa3, 1, 0)
          + NVL2(b.dong_sa4, 1, 0)
          + NVL2(b.dong_sa5, 1, 0)
          + NVL2(b.dong_sa6, 1, 0)
          ) cnt_dong
  FROM ct_gibon a
     , ct_dong  b
 WHERE a.part_cd    = b.part_cd   (+)
   AND a.cst_no     = b.cst_no    (+)
   AND a.cst_chg_no = b.cst_chg_no(+)
   AND a.reg_date   = b.reg_date  (+)
   AND a.sil_ymd    = b.sil_ymd   (+)
   AND a.sil_ymd BETWEEN '20180101' AND '20180228'
   AND a.sudang_yn = 'Y'
 GROUP BY a.part_cd, SUBSTR(a.sil_ymd, 5, 2)
;

 


by xcrew [2018.03.15 15:44:54]

항상 도움주셔서 감사합니다!!!

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