2014-10-22 2 views
0

데이터 볼륨 (이 경우 호출)을 수집 한 다음 월별로 정렬하는 다음과 같은 쿼리 (및 몇 가지 매우 유사한 쿼리)가 있습니다.SQL 서버 - 월별 선택 쿼리 결과 정렬

그것은 잘 작동하고 내가 필요로하는 결과를 출력합니다,하지만 난이 일을 더 실용적인/짧은 방법이 있어야이 느낌이 : 당신이 줄 수있는 팁

SELECT 
sum(case when datepart(mm,calldate) = '1' THEN 1 ELSE 0 END) AS 'JAN', 
sum(case when datepart(mm,calldate) = '2' THEN 1 ELSE 0 END) AS 'FEB', 
sum(case when datepart(mm,calldate) = '3' THEN 1 ELSE 0 END) AS 'MAR', 
sum(case when datepart(mm,calldate) = '4' THEN 1 ELSE 0 END) AS 'APR', 
sum(case when datepart(mm,calldate) = '5' THEN 1 ELSE 0 END) AS 'MAY', 
sum(case when datepart(mm,calldate) = '6' THEN 1 ELSE 0 END) AS 'JUN', 
sum(case when datepart(mm,calldate) = '7' THEN 1 ELSE 0 END) AS 'JUL', 
sum(case when datepart(mm,calldate) = '8' THEN 1 ELSE 0 END) AS 'AUG', 
sum(case when datepart(mm,calldate) = '9' THEN 1 ELSE 0 END) AS 'SEP', 
sum(case when datepart(mm,calldate) = '10' THEN 1 ELSE 0 END) AS 'OCT', 
sum(case when datepart(mm,calldate) = '11' THEN 1 ELSE 0 END) AS 'NOV', 
sum(case when datepart(mm,calldate) = '12' THEN 1 ELSE 0 END) AS 'DEC' 

FROM [Telephony].[dbo].[tbl_Outbound] 

WHERE source like '132%' 
     and duration > 300 

    union all 

SELECT 
sum(case when datepart(mm,calldate) = '1' THEN 1 ELSE 0 END) AS 'JAN', 
sum(case when datepart(mm,calldate) = '2' THEN 1 ELSE 0 END) AS 'FEB', 
sum(case when datepart(mm,calldate) = '3' THEN 1 ELSE 0 END) AS 'MAR', 
sum(case when datepart(mm,calldate) = '4' THEN 1 ELSE 0 END) AS 'APR', 
sum(case when datepart(mm,calldate) = '5' THEN 1 ELSE 0 END) AS 'MAY', 
sum(case when datepart(mm,calldate) = '6' THEN 1 ELSE 0 END) AS 'JUN', 
sum(case when datepart(mm,calldate) = '7' THEN 1 ELSE 0 END) AS 'JUL', 
sum(case when datepart(mm,calldate) = '8' THEN 1 ELSE 0 END) AS 'AUG', 
sum(case when datepart(mm,calldate) = '9' THEN 1 ELSE 0 END) AS 'SEP', 
sum(case when datepart(mm,calldate) = '10' THEN 1 ELSE 0 END) AS 'OCT', 
sum(case when datepart(mm,calldate) = '11' THEN 1 ELSE 0 END) AS 'NOV', 
sum(case when datepart(mm,calldate) = '12' THEN 1 ELSE 0 END) AS 'DEC' 

    FROM [Telephony].[dbo].[tbl_Outbound] 

    WHERE source like '132%' 

감사합니다 :)

+0

콜 데이터가 2014 또는 2013인지 여부는 실제로 신경 쓰지 않습니까? – Lamak

+0

이것은 매우 장황하지만, 자세한 정보는 크로스 탭/피벗 스타일 출력의 필요성에 기인하는 것으로 보입니다. 당신은 노조가없는 하나의 쿼리에서이 모든 것을 할 수 있지만,보기에는 못 생길 것입니다. – JNevill

+0

Lamak -이 테이블에는 12 개월의 롤링 데이터 만 포함되어 있으므로이 경우에는 사용하지 마십시오. – Uberzen1

답변

1

나는 다음과 같이 작동한다고 믿는다. 이 기능은 SQL Server의 피벗 기능을 사용합니다.

SELECT rowName,[January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December] 
FROM (
    SELECT 
     "Duration>300" as rowName, 
     datename(month, calldate) as MonthName, 
     Count(*) as recordCount 

    FROM 
     [Telephony].[dbo].[tbl_Outbound] 
    WHERE source like '132%' 
     and duration > 300 
    UNION ALL 
    SELECT 
     "AllDurations" as rowName, 
     datename(month, calldate) as MonthName, 
     Count(*) as recordCount 

    FROM 
     [Telephony].[dbo].[tbl_Outbound] 
    WHERE source like '132%' 
) as SourceTable 
PIVOT 
(
    Sum(recordCount) 
    FOR MonthName in ([January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December]) 
) AS PivotTable 
+0

감사합니다! 나는 네가 할 수 있다는 것을 몰랐다. 이것은 참으로 도움이된다! – Uberzen1

+0

나는 이것을 조정하기 위해 모두 calldate에 의해 그룹에 추가하고 rowName 뒤에 누락 된 쉼표를 추가했습니다. – Uberzen1

+0

그걸 테스트 할 서버가 없어도 나쁘지 않습니다! – JNevill