데이터베이스 개발자 질문과 답변 게시판
통계를 뽑는데 쿼리를 너무 많이 날려 시스템이 버벅대네요.
첨부파일을 봐주세요.
김유신의 1월 카운트, 2월, 3월, 4월 등등 제각각 연결해서 쿼리를 날리니 문제가 있네요.
한번의 쿼리로 김유신의 1월부터 12월까지 뽑아올수 없나요?
Comment 2
-
카즈야마(이정우)
2013.02.13 17:48
-
minsouk
2013.02.14 13:38
IF OBJECT_ID ('TBLX') IS NOT NULL
DROP TABLE TBLX
GOCREATE TABLE TBLX
(IDX INT
,A VARCHAR(100)
,B DATETIME
)
INSERT INTO TBLX VALUES (1, '김유신', '20120101'),(2, '김유신', '20120101'),(3, '김유신', '20120201'),(4, '김유신', '20120301'),(5, '김개똥', '20120501'),(6, '김유신2', '20120201'),(7, '김유신2', '20120301')
GO
SELECT A, SUM(CASE DATEPART(MM,B) WHEN 1 THEN 1 ELSE 0 END) '1월'
, SUM(CASE DATEPART(MM,B) WHEN 2 THEN 1 ELSE 0 END) '2월'
, SUM(CASE DATEPART(MM,B) WHEN 3 THEN 1 ELSE 0 END) '3월'
, SUM(CASE DATEPART(MM,B) WHEN 4 THEN 1 ELSE 0 END) '4월'
, SUM(CASE DATEPART(MM,B) WHEN 5 THEN 1 ELSE 0 END) '5월'
, SUM(CASE DATEPART(MM,B) WHEN 6 THEN 1 ELSE 0 END) '6월'
, SUM(CASE DATEPART(MM,B) WHEN 7 THEN 1 ELSE 0 END) '7월'
, SUM(CASE DATEPART(MM,B) WHEN 8 THEN 1 ELSE 0 END) '8월'
, SUM(CASE DATEPART(MM,B) WHEN 9 THEN 1 ELSE 0 END) '9월'
, SUM(CASE DATEPART(MM,B) WHEN 10 THEN 1 ELSE 0 END) '10월'
, SUM(CASE DATEPART(MM,B) WHEN 11 THEN 1 ELSE 0 END) '11월'
, SUM(CASE DATEPART(MM,B) WHEN 12 THEN 1 ELSE 0 END) '12월'
FROM TBLX
WHERE B >= '20120101' AND B < '20130101'
GROUP BY A
안녕하세요.
통계 데이터에서 각 컬럼별로 쿼리를 날린다고 생각되는데여 (쿼리를 여러번 날린다고 하셔서...)
해당 테이블의 인덱스 조건도 같이 있으면 좋을 듯하지만...
일단 통계 데이터는 많은 부분이 테이블 scan 하는 경우가 많아 배제 하고 작성해보았습니다.
select a.name,sum(a.m_1),sum(a.m_2),sum(a.m_3),sum(a.m_4)
from
(select name,
case when left(date,6)='201301' then 1 else 0 end as m_1,
case when left(date,6)='201302' then 1 else 0 end as m_2,
case when left(date,6)='201303' then 1 else 0 end as m_3,
case when left(date,6)='201304' then 1 else 0 end as m_4
.... 12월까지
from Tb_table
where name='김유신'
) as a
group by a.name;
쿼리를 여러번 날려 매번 scan 하는것보다 한번 scan할때 원하는 데이터를 뽑아오면 될듯해서요
case 문을 이용해서 각 월별 집계를 뽑았습니다.
이게 맞는 방법인지는 모르겠네요^^
고수님들이 더 좋은 의견주실거에요~~~
항상 테스트는 전/후 로 비교해보시길....