2013-06-21 2 views
0

2 개의 하위 쿼리에서 개수를 가져 오는 다음 쿼리를 사용하면 두 개수의 평균을 구해야합니다. 마지막 쿼리에서 C1에 오류가 발생했습니다.Sql 쿼리 합계 평균

Select c0.hour , AVG(c0.frequency)as 'AVG In', AVG(c1.frequency)as 'AVG Out' from 
(SELECT [Network] 
,cast ([date time]as date)as 'date' 
,datepart(hh,[date time])as 'hour' 
,[Scan Type] 
,count ([scan type])as frequency  
FROM [Pallex-DW].[dbo].[Scans] 
where Network like 'fr'and [Scan Type] like '3' 
group by Network ,datepart(hh,[date time]),cast ([date time]as date),[Scan Type])as c0 

Union 

(SELECT [Network] 
,cast ([date time]as date)as 'date' 
,datepart(hh,[date time])as 'hour' 
,[Scan Type] 
,count ([scan type])as frequency 
FROM [Pallex-DW].[dbo].[Scans] as c1 
where Network like 'fr'and [Scan Type] like '11' 
group by Network ,datepart(hh,[date time]),cast ([date time]as date),[Scan Type])c1 

답변

0

왜 유니언을 사용하고 있습니까?

쿼리가 작동해야합니다. 조합을 제거했습니다. c1과 c2를 결합하려면 where 절에 내용을 넣어야합니다.

Select 
c0.hour,AVG(c0.frequency)as 'AVG In',AVG(c1.frequency)as 'AVG Out' 
from 
(SELECT [Network] 
    ,cast ([date time]as date)as 'date' 
    ,datepart(hh,[date time])as 'hour' 
    ,[Scan Type] 
    ,count ([scan type])as frequency 
    FROM [Pallex-DW].[dbo].[Scans] 
    where Network like 'fr'and [Scan Type] like '3' 
    group by Network ,datepart(hh,[date time]),cast ([date time]as date),[Scan Type])as c0, 
(SELECT [Network] 
    ,cast ([date time]as date)as 'date' 
    ,datepart(hh,[date time])as 'hour' 
    ,[Scan Type] 
    ,count ([scan type])as frequency 
    FROM [Pallex-DW].[dbo].[Scans] as c1 
    where Network like 'fr'and [Scan Type] like '11' 
    group by Network ,datepart(hh,[date time]),cast ([date time]as date),[Scan Type])c1 
+0

당신은 c0과 c1에 가입하고 싶을 수도 있습니다 –

+0

나는 노동 조합과 관련된 문제를 해결했습니다 ...하지만 지금 AVG In과 AVG out은 완전히 동일합니다! 왜? – Egidio

+0

@Egidio AVG In 및 Avg Out이 동일하면 문제를 해결하지 못했습니다. – Paparazzi

1

쿼리의 문제는 실제로는 c0입니다. 난 당신이 크게 union을 제거하고 하나 개의 하위 쿼리의 모든 행을 선택하여 쿼리를 단순화 할 수 있다고 생각

Select 
c0.hour,AVG(c0.frequency)as 'AVG In',AVG(c1.frequency)as 'AVG Out' 
from 
((SELECT [Network] 
    ,cast ([date time]as date)as 'date' 
    ,datepart(hh,[date time])as 'hour' 
    ,[Scan Type] 
    ,count ([scan type])as frequency 
    FROM [Pallex-DW].[dbo].[Scans] 
    where Network like 'fr'and [Scan Type] like '3' 
    group by Network ,datepart(hh,[date time]),cast ([date time]as date),[Scan Type]) 
    Union 
(SELECT [Network] 
    ,cast ([date time]as date)as 'date' 
    ,datepart(hh,[date time])as 'hour' 
    ,[Scan Type] 
    ,count ([scan type])as frequency 
    FROM [Pallex-DW].[dbo].[Scans] as c1 
    where Network like 'fr'and [Scan Type] like '11' 
    group by Network ,datepart(hh,[date time]),cast ([date time]as date),[Scan Type])) as c 

그러나 :

이 버전을 시도해보십시오 노조는 첫 번째 쿼리에 별칭을 필요로하지 않는다 :

Select c.hour, AVG(case when [scan type] = '3' then 1.0*c.frequency end) as "AVG In", 
     AVG(case when [scan type] = '3' then 1.0*c.frequency end) as "AVG Out" 
from ((SELECT [Network], 
       cast([date time]as date)as "date", 
       datepart(hh,[date time])as "hour", 
       [Scan Type], 
       count ([scan type])as frequency 
     FROM [Pallex-DW].[dbo].[Scans] 
     where Network like 'fr'and [Scan Type] in ('3', '11') 
     group by Network ,datepart(hh,[date time]),cast ([date time]as date),[Scan Type] 
    ) as c 
group by hour 

최종 결과를 얻으려면 group by 절도 필요합니다. 또한 값을 1.0으로 곱하여 정수가 아닌 값으로 변환했습니다. 정수의 평균은 정수이며 오도 된 수 있습니다. 컬럼 이름 주변의 작은 따옴표도 제거했다. 큰 따옴표 또는 대괄호 (실제 상수와의 혼동을 피하기 위해)를 사용하십시오.

+0

감사합니다. 나는 당신에게 알려주려고 노력한다. – Egidio

+0

그것은 매우 우아한 솔루션이지만 확인하려면 null을 얻고 있습니다! – Egidio