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 41131 게시물 읽기
No. 41131
그룹별 비율 구하는 방법 질문드립니다..
작성자
박양희(sadadboy)
작성일
2016-04-20 15:07ⓒ
2016-04-20 15:11ⓜ
조회수
8,372

 

학반, 성별, 인원

 1학년 1반,남자, 10명

1학년 1반, 여자, 0명

1학년 2반, 남자, 15명

1학년 2반, 여자, 20명

1학년 3반, 남자, 21명

1학년 3반, 여자, 8명

1학년 4반, 남자, 0명

1학년 4반, 여자, 4명

1학년 6반, 남자, 7명

1학년 6반, 여자, 6명


이렇게 데이터가 있을때 

각 반, 남녀별  비율율 구하고 싶습니다.

 

          전체                   남자                    여자

1반, 몇명, 비율,     몇명, 비율,          몇명, 비율

2반, 몇명, 비율,     몇명, 비율,          몇명, 비율

3반, 몇명, 비율,     몇명, 비율,          몇명, 비율

4반, 몇명, 비율,     몇명, 비율,          몇명, 비율

5반, 몇명, 비율,     몇명, 비율,          몇명, 비율

6반, 몇명, 비율,     몇명, 비율,          몇명, 비율

합계   총인원, 100%, 남자인원, 남자비율, 여자인원, 여자비율

5반같은 경우는 없어도 0명  0%로 나오게 하고싶은데요..

 

모바일로 쓰는거라 자세히 못적어서 죄송합니다 ㅠ

 

이 글에 대한 댓글이 총 6건 있습니다.

WITH t AS
(
SELECT '1' hak, '1' ban, '남자' gen, 10 cnt FROM dual
UNION ALL SELECT '1', '1', '여자',  0 FROM dual
UNION ALL SELECT '1', '2', '남자', 15 FROM dual
UNION ALL SELECT '1', '2', '여자', 20 FROM dual
UNION ALL SELECT '1', '3', '남자', 21 FROM dual
UNION ALL SELECT '1', '3', '여자',  8 FROM dual
UNION ALL SELECT '1', '4', '남자',  0 FROM dual
UNION ALL SELECT '1', '4', '여자',  4 FROM dual
UNION ALL SELECT '1', '6', '남자',  7 FROM dual
UNION ALL SELECT '1', '6', '여자',  6 FROM dual
)
SELECT *
  FROM (SELECT hak
             , NVL(ban, '전체') ban
             , NVL(gen, '전체') gen
             , SUM(cnt) cnt
             , ROUND(
               RATIO_TO_REPORT(SUM(cnt))
               OVER(PARTITION BY hak, ban, GROUPING(gen))
               * 100, 2) rat
          FROM t
         GROUP BY hak, CUBE(ban, gen)
        )
 PIVOT (MIN(cnt) cnt, MIN(rat) rat FOR gen IN ( '전체' 전체
                                              , '남자' 남자
                                              , '여자' 여자
                                              ) )
 ORDER BY hak, ban
;

마농(manon94)님이 2016-04-20 16:23에 작성한 댓글입니다.

 마농님 감사합니다..

헌데  결과가 원하는 결과가 안나와서요.. 

전체에대한 비율은 맞게 나오는데  남자, 여자에 대한 비율이 각 반에대한 비율로 나오는데요.

남자 여자 비율도 전체 1학년 인원의 비율로 보고 싶습니다.

 

각반의 전체 비율도 학년 총 인원 대비 비율로 나와야 하고요

그리고 5반의 인원도 없지만 결과에는 0 ,0으로 나오게 하고 싶습니다..

 

댓글 주셨는데  다시 질문으로 답글달아서 죄송합니다

박양희(sadadboy)님이 2016-04-20 16:55에 작성한 댓글입니다.

결과표를 보여주세요. (실제 수치로)

마농(manon94)님이 2016-04-20 17:11에 작성한 댓글입니다.
이 댓글은 2016-04-20 17:31에 마지막으로 수정되었습니다.

학반, 성별, 인원

 1학년 1반,남자, 10명

1학년 1반, 여자, 0명

1학년 2반, 남자, 15명

1학년 2반, 여자, 20명

1학년 3반, 남자, 21명

1학년 3반, 여자, 8명

1학년 4반, 남자, 0명

1학년 4반, 여자, 4명

1학년 6반, 남자, 7명

1학년 6반, 여자, 6명

===================

결과 

학반,            전체인원,  전체비율,  남자인원,  남자비율, 여자인원, 여자비율

1학년1반  ,      10,             10.99,        10,          10.99,      0,            0         

1학년2반 ,       35,            38.46,        15,          16.48,      20,      21.98

1학년3반,       29,             31.87,          21,          23.08,      8,          8.79

1학년4반,       4,                 4.4,            0,               0 ,        4,      4.4

1학년5반,        0 ,                 0,              0,               0,        0,        0

1학년6반,        13,             14.29,         7,                7.69,     6,       6.59

 

 

보시기 불편하시다면 죄송합니다 ㅠ

박양희(sadadboy)님이 2016-04-20 17:40에 작성한 댓글입니다.
이 댓글은 2016-04-20 17:41에 마지막으로 수정되었습니다.

WITH t AS
(
SELECT '1' hak, '1' ban, '남자' gen, 10 cnt FROM dual
UNION ALL SELECT '1', '1', '여자',  0 FROM dual
UNION ALL SELECT '1', '2', '남자', 15 FROM dual
UNION ALL SELECT '1', '2', '여자', 20 FROM dual
UNION ALL SELECT '1', '3', '남자', 21 FROM dual
UNION ALL SELECT '1', '3', '여자',  8 FROM dual
UNION ALL SELECT '1', '4', '남자',  0 FROM dual
UNION ALL SELECT '1', '4', '여자',  4 FROM dual
UNION ALL SELECT '1', '6', '남자',  7 FROM dual
UNION ALL SELECT '1', '6', '여자',  6 FROM dual
)
SELECT *
  FROM (SELECT c.hak
             , NVL(a.ban, '전체') ban
             , NVL(b.gen, '전체') gen
             , NVL(SUM(c.cnt), 0) cnt
             , ROUND(
               RATIO_TO_REPORT(NVL(SUM(c.cnt), 0))
               OVER(PARTITION BY c.hak, GROUPING_ID(a.ban, b.gen))
               * 100, 2) rat
          FROM (SELECT LEVEL||'' ban FROM dual CONNECT BY LEVEL <= 6) a
         CROSS JOIN (SELECT '남자' gen FROM dual
                     UNION ALL SELECT '여자' FROM dual
                     ) b
          LEFT OUTER JOIN t c
          PARTITION BY (c.hak)
            ON a.ban = c.ban
           AND b.gen = c.gen
         GROUP BY c.hak, CUBE(a.ban, b.gen)
        )
 PIVOT (MIN(cnt) cnt, MIN(rat) rat FOR gen IN ( '전체' 전체
                                              , '남자' 남자
                                              , '여자' 여자
                                              ) )
 ORDER BY hak, ban
;

마농(manon94)님이 2016-04-20 20:10에 작성한 댓글입니다.

 감사합니다!!

덕분에해결했습니다..

감사합니다~~

박양희(sadadboy)님이 2016-04-21 17:06에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41134utl_smtp 에서 파일 첨부 기능 관련 질문
정재영
2016-04-21
8227
41133union all 사용시 순서 [1]
star
2016-04-21
7977
41132REGEXP_LIKE 다중 사용을 한개로 사용할수 있나요
하여가
2016-04-20
8013
41131그룹별 비율 구하는 방법 질문드립니다.. [6]
박양희
2016-04-20
8372
41130마농님께~~ 부탁드립니다. (PL/SQL 소스코드 암호화(wrap)시 0kb 파일생성 문의건.)
박용선
2016-04-19
7866
41127뷰에 대해서 문의드립니다. [3]
김기훈
2016-04-18
8028
41126어려운 쿼리질문_마농님 부탁드립니다 [3]
홍승종
2016-04-18
7778
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다