2016-05-05 8 views
0

私はMySQLを使用しています。私は、次の形式でデータを持っている - 私は指定された日付範囲のための訪問の種類ごとのページあたりの平均ページロード時間を生成しようとしているMySQl - AVG(AVG IF)&グループ

DATE  , PAGE , PAGE_LOAD_DURATION , VISIT_TYPE 
01-01-15 , A ,     6 , AM 
01-01-15 , B ,     4 , PM 
01-01-15 , C ,     5 , AM 
01-01-15 , D ,     4 , AM 
02-01-15 , B ,     13 , PM 
03-01-15 , C ,     15 , PM 
04-01-15 , A ,     17 , PM 
05-01-15 , A ,     34 , PM 
06-01-15 , B ,     56 , AM 
07-01-15 , C ,     12 , AM 
08-01-15 , D ,     89 , AM 
09-01-15 , B ,     34 , AM 
10-01-15 , R ,     12 , PM 
11-01-15 , T ,     56 , AM 
12-01-15 , E ,     78 , PM 
13-01-15 , B ,     90 , AM 
14-01-15 , A ,     34 , PM 
15-01-15 , A ,     56 , AM 
16-01-15 , B ,     23 , AM 
17-01-15 , A ,     15 , PM 
18-01-15 , R ,     17 , AM 
19-01-15 , Y ,     37 , PM 
20-01-15 , C ,     23 , AM 

私は、出力を生成したいのですが次の形式 -

select 
    PAGE, 
    SUM(IF(VISIT_TYPE = 'AM',AVERAGE_PAGE_LOAD_DUR,0)) AS SUM_AM, 
    SUM(IF(VISIT_TYPE = 'PM',AVERAGE_PAGE_LOAD_DUR,0)) AS SUM_PM 
from 
     PAGE_VISITS 
where 
    DATE >= '01-01-15' and DATE <= '09-01-15' 
group by 
    PAGE 
-

PAGE, VISIT_TYPE, AVERAGE_PAGE_LOAD_DUR 
A, AM, average_page_load_dur 
A, PM, average_page_load_dur 
B, AM, average_page_load_dur 
B, PM, average_page_load_dur 
C, AM, average_page_load_dur 
C, PM, average_page_load_dur 
D, AM, average_page_load_dur 
D, PM, average_page_load_dur 
so on 

ではなく、平均の合計を計算するには、私は以下のクエリを使用します0

平均を計算するには、私はSUMをAVGに置き換えましたが、すべての行がスキャンされて平均が計算されているので正しい方法ではないように見えますが、これはうまくいくと思います。他の場合は私を修正してください)

select 
    PAGE, 
    AVG(IF(VISIT_TYPE = 'AM',AVERAGE_PAGE_LOAD_DUR,0)) AS SUM_AM, 
    AVG(IF(VISIT_TYPE = 'PM',AVERAGE_PAGE_LOAD_DUR,0)) AS SUM_PM 
from 
     PAGE_VISITS 
where 
    DATE >= '01-01-15' and DATE <= '09-01-15' 
group by 
    PAGE 

どうすれば平均を働かせることができますか?

+0

1.ストア日付日付として。 – Strawberry

答えて

3

, 0を省略してください。私はcaseを好むので、私はこのように記述します。

select PAGE, 
     AVG(CASE WHEN VISIT_TYPE = 'AM' THEN AVERAGE_PAGE_LOAD_DUR END) AS AVG_AM, 
     AVG(CASE WHEN VISIT_TYPE = 'PM' THEN AVERAGE_PAGE_LOAD_DUR END) AS AVG_PM, 
from PAGE_VISITS 
where DATE >= '2015-01-01' and DATE <= '2015-09-01' 
group by PAGE; 

注:

  • AVG()NULL値を無視しますが、それは計算に0が含まれています。
  • 平均として計算された列は、おそらくSUM()と呼ばれるべきではありません。
  • 使用ISOとMySQLの標準日付形式は:YYYY-MM-DD

ページごとに2つの行を持つ十分に満足している場合は最後に、これは簡単です:

select PAGE, AVG(AVERAGE_PAGE_LOAD_DUR) AS AVG_page_load 
from PAGE_VISITS 
where DATE >= '2015-01-01' and DATE <= '2015-09-01' 
group by PAGE, VISIT_TYPE 
+0

ありがとうございましたGordon。私はケースステートメントが好きです。 SUMに関しては、 'SUM(CASE WHEN VISIT_TYPE = 'PM' THEN AVERAGE_PAGE_LOAD_DUR END)AVG_PM'の代わりに' SUM(CASE WHEN VISIT_TYPE = 'AM' THEN AVERAGE_PAGE_LOAD_DUR END)AVG_AM、 SUM IF( ' – usert4jju7

+0

@ usert4jju7 ...。はい、' AVG() 'の代わりに' SUM() 'が働きますが、' ELSE 0'を含めて 'SUM()'は意味があります。 。 –