database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41652 게시물 읽기
No. 41652
합계 구하는 쿼리 질문 입니다.
작성자
구휘(barrierkim)
작성일
2018-11-08 10:40:28
조회수
70

 안녕하세요 업무중 통계를 뽑아야 하는데 머리가 돌아가지 않아 도움을 요청 합니다.

 

일단 데이터는

WITH TEMP AS (

SELECT 'DOC1' KEYCOL, 'YXXXXXX' TARVAL FROM DUAL UNION ALL

SELECT 'DOC2' KEYCOL, 'XYXXXXX' TARVAL FROM DUAL UNION ALL

SELECT 'DOC3' KEYCOL, 'XYXXXXY' TARVAL FROM DUAL

)

SELECT * FROM TEMP 

TARVAL 컬럼의 값에 Y가 몇번째 있는 것들의 통계를 뽑아야 합니다. Y값이 문자열중 한개만 있으면 편하겠는데

문제는 Y값이 없을수도 있고  1~7개 까지 될수 있습니다. 'XXXXXXX'  ~ 'YYYYYYY'  이렇게요 

위의 3번째 데이터는 둘째 자리에도 Y가 있고 일곱번째 자리에도 Y가 있으므로 2번 카운팅이 되어야 합니다.

위에 TEMP데이터의 통계는

Y의 자릿수 첫째 둘째 셋째 넷째 다섯째 여섯째 일곱째
  1            
    1          
    1         1
SUM 1 2         1

 

이런식으로

첫째자리 Y가 있는것의 합은 1 

둘째자리 Y 합 2

셋째~여섯째 0

일곱째 1

요렇게 결과를 뽑고 싶은데 어렵네요 ...

 

 

 

 

이 글에 대한 댓글이 총 2건 있습니다.
CASE문과 substr만 쓰시면 될 것 같습니다.


WITH TEMP AS (
    SELECT 'DOC1' KEYCOL, 'YXXXXXX' TARVAL FROM DUAL UNION ALL
    SELECT 'DOC2' KEYCOL, 'XYXXXXX' TARVAL FROM DUAL UNION ALL
    SELECT 'DOC3' KEYCOL, 'XYXXXXY' TARVAL FROM DUAL
)

SELECT DECODE(GROUPING(RNUM),1, '합계', max(keycol)) AS keycol
        ,DECODE(GROUPING(RNUM),1, sum(첫째), max(첫째)) AS 첫째
        ,DECODE(GROUPING(RNUM),1, sum(둘째), max(둘째)) AS 둘째
        ,DECODE(GROUPING(RNUM),1, sum(셋째), max(셋째)) AS 셋째
        ,DECODE(GROUPING(RNUM),1, sum(넷째), max(넷째)) AS 넷째
        ,DECODE(GROUPING(RNUM),1, sum(다섯째), max(다섯째)) AS 다섯째
        ,DECODE(GROUPING(RNUM),1, sum(여섯째), max(여섯째)) AS 여섯째
        ,DECODE(GROUPING(RNUM),1, sum(일곱째), max(일곱째)) AS 일곱째
FROM(        
    SELECT keycol
        ,CASE WHEN substr(TARVAL,1,1) = 'Y' THEN 1 ELSE 0 END AS "첫째"
        ,CASE WHEN substr(TARVAL,2,1) = 'Y' THEN 1 ELSE 0 END AS "둘째"
        ,CASE WHEN substr(TARVAL,3,1) = 'Y' THEN 1 ELSE 0 END AS "셋째"
        ,CASE WHEN substr(TARVAL,4,1) = 'Y' THEN 1 ELSE 0 END AS "넷째"
        ,CASE WHEN substr(TARVAL,5,1) = 'Y' THEN 1 ELSE 0 END AS "다섯째"
        ,CASE WHEN substr(TARVAL,6,1) = 'Y' THEN 1 ELSE 0 END AS "여섯째"
        ,CASE WHEN substr(TARVAL,7,1) = 'Y' THEN 1 ELSE 0 END AS "일곱째"
        ,ROWNUM AS RNUM
    FROM TEMP 
) T
GROUP BY ROLLUP(RNUM)    
박인호(paerae)님이 2018-11-08 11:45:50에 작성한 댓글입니다.

SELECT keycol
     , COUNT(DECODE(SUBSTR(tarval, 1, 1), 'Y', 1)) cnt1
     , COUNT(DECODE(SUBSTR(tarval, 2, 1), 'Y', 1)) cnt2
     , COUNT(DECODE(SUBSTR(tarval, 3, 1), 'Y', 1)) cnt3
     , COUNT(DECODE(SUBSTR(tarval, 4, 1), 'Y', 1)) cnt4
     , COUNT(DECODE(SUBSTR(tarval, 5, 1), 'Y', 1)) cnt5
     , COUNT(DECODE(SUBSTR(tarval, 6, 1), 'Y', 1)) cnt6
     , COUNT(DECODE(SUBSTR(tarval, 7, 1), 'Y', 1)) cnt7
  FROM temp
 GROUP BY ROLLUP(keycol)
;

마농(manon94)님이 2018-11-08 13:19:51에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41654주차 구하는 방법 문의 [4]
이민우
2018-11-13
41
41653문자 치환에 대해서 질문 드립니다. [6]
그림자가면
2018-11-09
135
41652합계 구하는 쿼리 질문 입니다. [2]
구휘
2018-11-08
70
41651데이터베이스 일대일 관계 릴레이션 변환 질문합니다. [1]
SYJ
2018-11-04
86
41650컬럼에서 불러온 계산식 그대로 계산하는법이 있나요? [3]
장만수
2018-11-04
78
41649가로 데이터 세로 표현 질문드립니다. [2]
백기열
2018-11-01
84
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2018 DSN, All rights reserved.
작업시간: 0.072초, 이곳 서비스는
	PostgreSQL v10.4로 자료를 관리합니다