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
운영게시판
최근게시물
MySQL Q&A 30947 게시물 읽기
No. 30947
안녕하세요. 통계쿼리 관련하여 질문드립니다.
작성자
이호수(reverse1990)
작성일
2016-04-12 15:13ⓒ
2016-04-12 15:14ⓜ
조회수
6,068

가입하자마자 질문글을 쓰게 되어 죄송합니다.

하루동안 고민해도 답을 얻지 못하여 너무 답답하여 글을 작성합니다.

학년 점수대별 인원수
전체 80이상 30 
60이상 80미만  27
40이상 60미만  24
20이상 40미만  21
0이상 20미만  18
 120
1 80이상 10 
60이상 80미만  9
40이상 60미만  8
20이상 40미만  7
0이상 20미만  6
 40
2 80이상 10 
60이상 80미만  9
40이상 60미만  8
20이상 40미만  7
0이상 20미만  6
 40
3 80이상 10 
60이상 80미만  9
40이상 60미만  8
20이상 40미만  7
0이상 20미만  6
 40

 이런식으로 화면에 뿌려줘야 합니다...

 학년은 GRADE 칼럼에 1,2,3으로 구분됩니다. SCORE 컬럼은 점수 부분이구요.

 SCORE를 구간별로 묶어서 카운트를 해야 하는데...

 jqgrid를 사용하기 때문에 위의 데이터대로 뽑아와야만 합니다.

 

쿼리결과는 아래와 같이 나와야 합니다...

제 머리로는 구간별로 뽑고(80이상, 60이상 80미만...) UNION ALL로 묶은 뒤

GROUP BY 하는것 외에는 생각이 안납니다.

어떻게 하면 좋을까요!

grade score_rt cnt
ALL 80이상 30
ALL 60이상 80미만 27
ALL 40이상 60미만 24
ALL 20이상 40미만 21
ALL 0이상 20미만 18
ALL 120
1 80이상 10
1 60이상 80미만 9
1 40이상 60미만 8
1 20이상 40미만 7
1 0이상 20미만 6
1 40
2 80이상 10
2 60이상 80미만 9
2 40이상 60미만 8
2 20이상 40미만 7
2 0이상 20미만 6
2 40
3 80이상 10
3 60이상 80미만 9
3 40이상 60미만 8
3 20이상 40미만 7
3 0이상 20미만 6
3 40

 

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

SELECT a.grade_nm
     , b.txt
     , COUNT(c.grade) cnt
  FROM (-- 학년 코드 --
        SELECT 0 grade, '전체' grade_nm
        UNION ALL SELECT 1, '1학년'
        UNION ALL SELECT 2, '2학년'
        UNION ALL SELECT 3, '3학년'
        ) a
 CROSS JOIN
       (-- 점수대 코드 --
        SELECT 1 no, '80이상' txt, 80 s, 101 e
        UNION ALL SELECT 2, '60이상 80미만', 60,  80
        UNION ALL SELECT 3, '40이상 60미만', 40,  60
        UNION ALL SELECT 4, '20이상 40미만', 20,  40
        UNION ALL SELECT 5, '20미만'       ,  0,  20
        UNION ALL SELECT 9, '계'           ,  0, 101
        ) b
  LEFT OUTER JOIN
       (-- Sample Data --
        SELECT 1 grade, 80 score
        UNION ALL SELECT 3, 10
        ) c
    ON (c.grade = a.grade OR a.grade = 0)
   AND c.score >= b.s
   AND c.score <  b.e
 GROUP BY a.grade, a.grade_nm, b.no, b.txt
;

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

 마농님 정말 감사드립니다

이호수(reverse1990)님이 2016-04-18 11:32에 작성한 댓글입니다.

 한가지만 더 여쭤볼께요!

점수대별 비율은 어떻게 하면 좋을까요...

이호수(reverse1990)님이 2016-04-18 16:51에 작성한 댓글입니다.

SELECT x.grade_nm
     , x.txt
     , x.cnt
     , ROUND(x.cnt / y.tot * 100, 2) rat
  FROM (-- 1. 학년별/점수대별 학생수 --
        SELECT a.grade, a.grade_nm
             , b.no
             , b.txt
             , COUNT(c.grade) cnt
          FROM (-- 학년 코드 --
                SELECT 0 grade, '전체' grade_nm
                UNION ALL SELECT 1, '1학년'
                UNION ALL SELECT 2, '2학년'
                UNION ALL SELECT 3, '3학년'
                ) a
         CROSS JOIN
               (-- 점수대 코드 --
                SELECT 1 no, '80이상' txt, 80 s, 101 e
                UNION ALL SELECT 2, '60이상 80미만', 60,  80
                UNION ALL SELECT 3, '40이상 60미만', 40,  60
                UNION ALL SELECT 4, '20이상 40미만', 20,  40
                UNION ALL SELECT 5, '20미만'       ,  0,  20
                UNION ALL SELECT 9, '계'           ,  0, 101
                ) b
          LEFT OUTER JOIN
               (-- Sample Data --
                SELECT 1 grade, 80 score
                UNION ALL SELECT 3, 10
                ) c
            ON (c.grade = a.grade OR a.grade = 0)
           AND c.score >= b.s
           AND c.score <  b.e
         GROUP BY a.grade, a.grade_nm, b.no, b.txt
        ) x
 INNER JOIN
       (-- 2. 학년별 전체 학생수 --
        SELECT a.grade
             , NULLIF(COUNT(c.grade), 0) tot
          FROM (-- 학년 코드 --
                SELECT 0 grade, '전체' grade_nm
                UNION ALL SELECT 1, '1학년'
                UNION ALL SELECT 2, '2학년'
                UNION ALL SELECT 3, '3학년'
                ) a
          LEFT OUTER JOIN
               (-- Sample Data --
                SELECT 1 grade, 80 score
                UNION ALL SELECT 3, 10
                ) c
            ON (c.grade = a.grade OR a.grade = 0)
         GROUP BY a.grade
        ) y
    ON x.grade = y.grade
 ORDER BY x.grade, x.no
;

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

SELECT a.grade
     , a.grade_nm
     , b.no
     , b.txt
     , COUNT(CASE WHEN c.score >= b.s AND c.score < b.e THEN 1 END) cnt
     , ROUND(
       COUNT(CASE WHEN c.score >= b.s AND c.score < b.e THEN 1 END)
            / NULLIF(COUNT(c.grade), 0)
            * 100, 2) rat
  FROM (-- 학년 코드 --
        SELECT 0 grade, '전체' grade_nm
        UNION ALL SELECT 1, '1학년'
        UNION ALL SELECT 2, '2학년'
        UNION ALL SELECT 3, '3학년'
        ) a
 CROSS JOIN
       (-- 점수대 코드 --
        SELECT 1 no, '80이상' txt, 80 s, 101 e
        UNION ALL SELECT 2, '60이상 80미만', 60,  80
        UNION ALL SELECT 3, '40이상 60미만', 40,  60
        UNION ALL SELECT 4, '20이상 40미만', 20,  40
        UNION ALL SELECT 5, '20미만'       ,  0,  20
        UNION ALL SELECT 9, '계'           ,  0, 101
        ) b
  LEFT OUTER JOIN
       (-- Sample Data --
        SELECT 1 grade, 80 score
        UNION ALL SELECT 3, 10
        ) c
    ON (c.grade = a.grade OR a.grade = 0)
 GROUP BY a.grade, a.grade_nm, b.no, b.txt
 ORDER BY a.grade, b.no
;

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

 와!!!! 정말 감사드립니다...

기존에 허접했던 쿼리를 도와주신 쿼리로 바꾸니

퍼포먼스 차이부터가 장난이 아니네요~ ^^

이호수(reverse1990)님이 2016-04-19 14:49에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
30951mariadb client로 mysql 서버 접속 관련 crontab으로 실행시 접속 안됨 [1]
손문수
2016-04-20
6722
30950MYSQL 서버 구축때 DB 마다 저장 경로는 다르게 할 수 있나요? [1]
날두
2016-04-19
5835
30948Waiting for table metadata lock 관련하여 질문합니다 [1]
이민범
2016-04-14
9993
30947안녕하세요. 통계쿼리 관련하여 질문드립니다. [6]
이호수
2016-04-12
6068
30945error 1064 뜨는것과 관련해서..제발 도와주세요 [1]
김차열
2016-04-07
5712
30944mysql과 c++ 연동 할떄 컴파일 오류나요 ㅠㅠ
헬픔요
2016-04-06
5592
30942Mysql 웹접속은 되는데 tcp ip로 접속이 안됩니다 [1]
RayYun
2016-04-01
5750
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2022 DSN, All rights reserved.
작업시간: 0.076초, 이곳 서비스는
	PostgreSQL v14.2로 자료를 관리합니다