2009-02-04 3 views
0

MySQL 쿼리를 작성하여 주어진 기간에 여러 카테고리의 항목 수를 확인합니다. 내 초기 시도는이처럼 보였다 :GROUP BY/HAVING을 사용하여 서브 팩을 리팩토링합니까?

select Title, 
    (select count(*) from entries where CategoryID=1 
    and Date >= @StartDate and Date <= @EndDate) as Cat1, 
    (select count(*) from entries where CategoryID=2 
    and Date >= @StartDate and Date <= @EndDate) as Cat2, 
    (select count(*) from entries where CategoryID is null 
    and Date >= @StartDate and Date <= @EndDate) as UnkownCategory 
from entries 
    where Date >= @StartDate and Date <= @EndDate 

표는 매우 크고, 내가 속도를 쿼리를 리팩토링하고 싶습니다,하지만 난 방법을 잘 모르겠어요 -이 HAVING/GROUP BY를 사용하여 다시 작성 될 수있다 나는 또 다른 방법이 있습니까?

편집 : 샘플 결과 집합 -이 같은 :

Title | Category 1 Total | Category 2 Total | Unknown Category Total 
ABC  1     3     0 
DEF  2     7     2 
+0

당신이 예를 들어 결과 집합을 제공 할 수 있습니다 : 다른 결과 레이아웃을 반환하지만, 약간의 개념적으로 간단 것

대안? –

+0

피벗 쿼리를 수행하고 있습니다. – Loki

답변

3
select Title, SUM(CategoryID=1) as Cat1, SUM(categoryID=2) as Cat2, 
SUM(categoryID IS NULL) as UnknownCategory 
FROM entries 
WHERE Date BETWEEN @StartDate AND @EndDate 
GROUP BY Title 

당신은 합계에서 식() 함수를 스틱 수 : 진실은 하나에 해당, 거짓은 0이 또한 내가 조금 빠른 운영자 사이의 사용과 동일합니다.

select Title, CategoryID, count(*) 
from entries 
WHERE Date BETWEEN @StartDate AND @EndDate 
group by Title, CategoryID 
+0

이 형식을 사용해 주셔서 감사합니다. 보고서 생성을 변경하지 않아도됩니다. 그것은 또한 꽤 빠른 것 같습니다. – palmsey

+0

네, 두 번째 해결책은 rikh가 제안한 것입니다. 그 형식이 다루기가 쉽기 때문에 충분히 빠르지 만 SUM 버전을 고집합니다. 감사! – palmsey

0
Select COUNT(*), sTitle, CategoryID FROM entries 
WHERE Date >= @StartDate and Date <= @EndDate 
GROUP BY CategoryID, sTitle 
+0

결과 집합에 CategoryID를 더 잘 추가하십시오! –

+0

예. 나는 지금 그것을 편집했다. –

+0

감사합니다. 그러나 실제로 약간의 수정이 이루어 졌다고 생각합니다. 날짜 (Date) = @StartDate 및 Date <= @EndDate 인 항목에서 개수 (*), sTitle, CategoryID FROM 항목 선택 GROUP BY CategoryID, sTitle – palmsey

0

방법처럼, 다음 특정 범주를 필터링 할 필요 문을 사용하여 카테고리 ID로 그룹화에 대한 :

select CategoryID, count(*) 
from entries 
where Date >= @StartDate AND Date <= @EndDate 
group by CategoryID 
having CategoryID = 1 or CategoryID = 2 or CategoryID is null 

카테고리 당 여러 제목이있는 경우 두 필드로 그룹화 할 수 있습니다 :

select Title, CategoryID, count(*) 
from entries 
where Date >= @StartDate AND Date <= @EndDate 
group by Title, CategoryID 
having CategoryID = 1 or CategoryID = 2 or CategoryID is null 
+0

where 절의 categoryID 조건은 having 절이 아닙니다. – jmucchiello

관련 문제