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 30952 게시물 읽기
No. 30952
통계쿼리 질문합니다.
작성자
이호수(reverse1990)
작성일
2016-04-25 15:10ⓒ
2016-04-25 15:11ⓜ
조회수
7,449

동기간 대비 전년,전월,전일,금년,당월,당일 데이터를 구해야 합니다.

2016-04-25기준

전년은 2015-04-01~04-31

전월은 2016-03-01~03-31

금년은 2016-04-01~04-25

당월은 2016-04-01~04-25

당일은 2016-04-25

전일은 휴일인지 아닌지 달력 테이블에서 공휴일 여부를 체크하여 전일을 구해와야 합니다.

예) 전일 2016-04-22

 

아래와 같이 통계 데이터를 뽑아와야 하는데 어떻게 하면 좋을까요...

각 통계에 대한 조건은 2~3가지 정도 있습니다.

지금은 COUNT(CASE WHEN 조건1 AND 조건2 AND 조건3 AND 날짜) 식으로 계산중입니다 ㅜ

컨트롤 단에서 데이터 가공하는것은 가능합니다 ㅜㅜ

날짜 전년 전월 전일 금년 당월 당일
2016-04-18  10건 20건 30건  40건(400%)  40건(200%)  15건(50%) 
2016-04-19  ...          
2016-04-20  ...          
2016-04-21  ...          
2016-04-22  ...          
2016-04-23  ...          
2016-04-24  ...          

 

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

SELECT a.dt
     , cnt1
     , cnt2
     , cnt3
     , cnt4
     , cnt5
     , cnt6
     , ROUND(cnt4 / NULLIF(cnt1, 0), 2) rat1
     , ROUND(cnt5 / NULLIF(cnt2, 0), 2) rat2
     , ROUND(cnt6 / NULLIF(cnt3, 0), 2) rat3
  FROM (SELECT a.dt
             , COUNT(CASE WHEN b.dt BETWEEN a.s1 AND a.e1 THEN 1 END) cnt1
             , COUNT(CASE WHEN b.dt BETWEEN a.s2 AND a.e2 THEN 1 END) cnt2
             , COUNT(CASE WHEN b.dt = a.s3                THEN 1 END) cnt3
             , COUNT(CASE WHEN b.dt BETWEEN a.s4 AND a.e4 THEN 1 END) cnt4
             , COUNT(CASE WHEN b.dt BETWEEN a.s5 AND a.e5 THEN 1 END) cnt5
             , COUNT(CASE WHEN b.dt = a.dt                THEN 1 END) cnt6
          FROM (SELECT dt
                     , CONCAT(LEFT(dt, 4)-1, '-01-01')                  s1
                     , dt - INTERVAL 12 month                           e1
                     , LAST_DAY(dt - INTERVAL 2 MONTH) + INTERVAL 1 DAY s2
                     , LAST_DAY(dt - INTERVAL 1 MONTH)                  e2
                     , CONCAT(LEFT(dt, 4), '-01-01')                    s4
                     , dt                                               e4
                     , LAST_DAY(dt - INTERVAL 1 MONTH) + INTERVAL 1 DAY s5
                     , dt                                               e5
                     , (SELECT dt
                          FROM calendar
                         WHERE dt < a.dt
                           AND st = '평일'
                         ORDER BY dt DESC
                         LIMIT 1
                        ) s3
                  FROM (SELECT '2016-04-25' dt) a
                ) a
         INNER JOIN data_table b
            ON b.dt BETWEEN a.s1 AND a.e5
         GROUP BY a.dt
        ) a
;

마농(manon94)님이 2016-04-26 09:09에 작성한 댓글입니다.
이 댓글은 2016-04-26 13:19에 마지막으로 수정되었습니다.

일단 마농님께 또 감사하다는 말씀드립니다 ^^.

 

답변주신 쿼리는 4월 25일 특정일 기준으로 구하는건데

파라미터가 기간일 경우는 방법이 없을까요??

 

저도 특정일 기준으로는 구해봤습니다..!

자바단에서 받은 기간을 하루씩 끊어서 쿼리를 보내봤는데

이 경우는 기간만큼 쿼리를 돌기 때문에...

 

다른 방법은 없을까요?

이호수(reverse1990)님이 2016-04-28 20:39에 작성한 댓글입니다.
이 댓글은 2016-04-28 20:57에 마지막으로 수정되었습니다.

(SELECT '2016-04-25' dt) a
이 부분만 바꾸면 되죠.
(SELECT dt
   FROM calendar
  WHERE dt BETWEEN '2016-04-18' AND '2016-04-24'
) a

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

(__) 그걸생각못했네요...

정말 감사드려요...

 

벌써 2번째 도움받네요 ㅜ.ㅜ

이호수(reverse1990)님이 2016-04-29 09:55에 작성한 댓글입니다.

b 테이블을 이너조인시 인덱스를 못타는데,,,

a 테이블이 서브쿼리라서 그런가요??ㅠ.ㅠ

이호수(reverse1990)님이 2016-04-29 10:49에 작성한 댓글입니다.

ON b.dt BETWEEN a.s1 AND a.e5

 

b 테이블이 먼저 scan 될 것으로 보입니다.

조건이 없으니 full scan 될듯 하고요

balance님이 2016-05-09 16:45에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
30957간단한 구문좀 도와주세요... [1]
한강희
2016-05-06
6941
30956MFC ODBC로 mariadb 연결시 오류
심시미
2016-05-05
7100
30955mysql 구문에러 도와주세요 ㅠ [2]
김차열
2016-05-03
8175
30952통계쿼리 질문합니다. [6]
이호수
2016-04-25
7449
30951mariadb client로 mysql 서버 접속 관련 crontab으로 실행시 접속 안됨 [1]
손문수
2016-04-20
7519
30950MYSQL 서버 구축때 DB 마다 저장 경로는 다르게 할 수 있나요? [1]
날두
2016-04-19
6553
30948Waiting for table metadata lock 관련하여 질문합니다 [1]
이민범
2016-04-14
10729
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.049초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다