통계쿼리를 작성하려 하는데 감이 안잡힙니다. 고수님들 도와주십시요. 0 3 772

by db초보 [MySQL] mariadb 통계 [2019.06.03 22:13:54]


t h v
1.00000 1.02222 2.91111
1.00000 1.04444 2.86667
1.00000 1.53333 2.75556
1.00000 1.30769 2.84615
1.00000 1.04444 2.88889
1.00000 1.30769 2.84615
1.00000 1.06667 2.80000

  다음과 같은 데이터가 있다고 할때 이녀석들을 통계 형태로 뽑아 내고 싶습니다. 기준은 t필드입니다. 

   출력 형태는 그냥 임시로 카운트 했습니다. 

  t값대비 v값 -10% t값대비 v값
-10%이상10%이하
t값대비 v값
10%이상 20%이하
t값대비 v값
20%이상
t값대비 h값 -10%미만         0          0          0      0
t값대비 h값 -10%이상 10미만         1          7          0      0
t값대비 h값 10%이상 20미만         1          0          0      0
t값대비 h값 20%이상         0          0          0      0

                                                               

 어떻게 하면 이런식으로 출력할 수 있을까요?? 고수님들 도움 부탁드립니다.

도무지 감이 안잡히네요...ㅠㅠ

by 마농 [2019.06.04 08:01:13]

질문하실때 이런식으로 표현되었음 좋겠다 하고서, 값은 아무렇게나 적지 말아 주세요.
원본 대비 결과표로 정확한 값을 적어 주세요.
질문을 이해하는데 방해가 됩니다. 헷갈려요.

WITH t AS
(
SELECT 1.00000 t, 1.02222 h, 2.91111 v
UNION ALL SELECT 1.00000, 1.04444, 2.86667
UNION ALL SELECT 1.00000, 1.53333, 2.75556
UNION ALL SELECT 1.00000, 1.30769, 2.84615
UNION ALL SELECT 1.00000, 1.04444, 2.88889
UNION ALL SELECT 1.00000, 1.30769, 2.84615
UNION ALL SELECT 1.00000, 1.06667, 2.80000
)
SELECT a.seq
     , CASE a.seq
       WHEN 1 THEN '-10%미만'
       WHEN 2 THEN '-10%이상~10%미만'
       WHEN 3 THEN ' 10%이상~20%미만'
       WHEN 4 THEN ' 20%이상'
        END "t값대비 h값"
     , COUNT(CASE v WHEN 1 THEN 1 END) "t값대비 v값 -10%미만"
     , COUNT(CASE v WHEN 2 THEN 1 END) "t값대비 v값 -10%이상~10%미만"
     , COUNT(CASE v WHEN 3 THEN 1 END) "t값대비 v값  10%이상~20%미만"
     , COUNT(CASE v WHEN 4 THEN 1 END) "t값대비 v값  20%이상"
  FROM (SELECT * FROM seq_1_to_4) a  -- MariaDB 전용
  LEFT OUTER JOIN
       (SELECT CASE WHEN              h < -10 THEN 1
                    WHEN h >= -10 AND h <  10 THEN 2
                    WHEN h >=  10 AND h <  20 THEN 3
                    WHEN h >=  20             THEN 4
                END h
             , CASE WHEN              v < -10 THEN 1
                    WHEN v >= -10 AND v <  10 THEN 2
                    WHEN v >=  10 AND v <  20 THEN 3
                    WHEN v >=  20             THEN 4
                END v
          FROM (SELECT (h / t - 1) * 100 h
                     , (v / t - 1) * 100 v
                  FROM t
                ) a
        ) b
    ON a.seq = b.h
 GROUP BY a.seq
;

 


by 마농 [2019.06.04 08:18:47]
WITH data_t AS
(
SELECT 1.00000 t, 1.02222 h, 2.91111 v
UNION ALL SELECT 1.00000, 1.04444, 2.86667
UNION ALL SELECT 1.00000, 1.53333, 2.75556
UNION ALL SELECT 1.00000, 1.30769, 2.84615
UNION ALL SELECT 1.00000, 1.04444, 2.88889
UNION ALL SELECT 1.00000, 1.30769, 2.84615
UNION ALL SELECT 1.00000, 1.06667, 2.80000
)
, code_t AS
(
SELECT  1 seq, -9999 x, -10 y, '-10%미만' z
UNION ALL SELECT 2, -10,   10, '-10%이상~10%미만'
UNION ALL SELECT 3,  10,   20, ' 10%이상~20%미만'
UNION ALL SELECT 4,  20, 9999, ' 20%이상'
)
SELECT a.seq
     , a.z "t값대비 h값"
     , COUNT(CASE c.seq WHEN 1 THEN 1 END) "t값대비 v값 -10%미만"
     , COUNT(CASE c.seq WHEN 2 THEN 1 END) "t값대비 v값 -10%이상~10%미만"
     , COUNT(CASE c.seq WHEN 3 THEN 1 END) "t값대비 v값  10%이상~20%미만"
     , COUNT(CASE c.seq WHEN 4 THEN 1 END) "t값대비 v값  20%이상"
  FROM code_t a
  LEFT OUTER JOIN
       (SELECT (h / t - 1) * 100 h
             , (v / t - 1) * 100 v
          FROM data_t
        ) b
    ON b.h >= a.x
   AND b.h <  a.y
  LEFT OUTER JOIN code_t c
    ON b.v >= c.x
   AND b.v <  c.y
 GROUP BY a.seq, a.z
;

 


by db초보 [2019.06.04 09:42:27]

마농님 감사합니다..  잘 참고하겠습니다.

 

그리고 질문할때도 좀더 신경써서 하도록 하겠습니다. 감사합니다. ^^

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