2010-06-22 4 views
1

문서 정보 (DocID, 이름, 유형, 소유자 등)를 저장하는 데이터베이스 테이블이 있습니다. 그런 다음 문서가 다운로드 된 시간 (DocID, DownloadTime 등)을 저장하는 다른 테이블이 있습니다. 저는 여러 종류의 문서 (정책, 양식, 출판물 등)가 특정 월과 월에 도착하는 히트 수를 기록하기위한 페이지를 설정하려고합니다. 사용자가 선택한 각각에 대한 드롭 다운이 있습니다.날짜별로 그룹화하지 않습니까?

나는 또한 월 또는 연도를 비워 둘 수 있기를 원하므로 사용자는 1 년 내 모든 달에 대한 조회수를 얻을 수 있습니다. 사용자가 월과 연도를 선택하면 아래 쿼리가 제대로 작동합니다. 그러나 월 또는 연도가 비어 있으면 gridview는 그룹화 된 문서 유형을 표시하지 않습니다. 나는 2010 년 1 월 명중을보고 싶어 예를 들어, 내가 얻을 :

Policies : 210 hits 
Forms: 98 hits 

그러나 사용자가 2010 년에 모든 달을 선택할 때, 사용자가 가져옵니다

Policies: 210 hits 
Policies: 87 hits 
Policies: 23 hits 
Policies: 87 hits 
Forms 

그래서 나는 여러 달 동안 다른 행을 얻고 있지만 한 종류로 그룹화되지는 않았습니다. 검색어가 잘못된 곳은 어디입니까?

SELECT COUNT(Counter.DocID) AS Counter, 
     Doc.DocType, 
     MONTH(Counter.DownloadDate) AS MonthDownload, 
     YEAR(Counter.DownloadDate) AS YearDownload 
    FROM Counter 
     INNER JOIN Doc ON Counter.DocID = Doc.DocID 
GROUP BY Doc.DocType, 
     MONTH(Counter.DownloadDate), 
     YEAR(Counter.DownloadDate) 
HAVING (MONTH(Counter.DownloadDate) = @Month1 OR @Month1 IS NULL) AND 
     (YEAR(Counter.DownloadDate) = @Year1 OR @Year1 IS NULL) 

답변

2

문제는 GROUP BY 절에 있습니다.

언제든지 사람들의이 다른 사람과 다른 것을 의미 GROUP BY에서 DocType, 월, 년 말한다면

, 별도로을 계산합니다.

GROUP 전체 연도를 계산하려면 1 년 단위로을 입력하고 매년 매월 계산하려면 1 년 단위로 그룹화하십시오.

+0

4 초 후에 나를 이길 수 있습니다! –

+0

질문을 편집하는 데 시간을 낭비해서는 안됩니다 : P –

+0

글쎄, 당신은 내가 감사 할 수 있다고 말하는 것보다 빠릅니다. – netNewbi3

0

연간 집계를 원하면 월별로 그룹화하지 않는 다른 쿼리를 사용해야합니다. 그렇지 않은 경우 연도 내 다른 월의 계수를 더하기 위해 결과를 사후 처리해야합니다.

작성된대로 코드는 항상 월과 연도별로 그룹화되어 월이 바뀔 때 새로운 행을 생성합니다. SQL에서는 모든 규칙을 위반하지 않고 (ok, 나는 과장합니다 - 많은 규칙) 다른 작업을 수행 할 수 없습니다.

0

쿼리에서 월 관련 그룹화를 제거하여 주어진 연도에 문서 유형 당 하나의 집계 된 레코드를 가져옵니다.

SELECT COUNT(Counter.DocID) AS Counter, 
     Doc.DocType, 
     YEAR(Counter.DownloadDate) AS YearDownload 
    FROM Counter 
     INNER JOIN Doc ON Counter.DocID = Doc.DocID 
GROUP BY Doc.DocType, 
     YEAR(Counter.DownloadDate) 
HAVING 
     (YEAR(Counter.DownloadDate) = @Year1 OR @Year1 IS NULL) 
관련 문제