2017-07-18 14 views
0

ピボットの助けを借りて平均を求めようとしていますが、正しい解決策を見つけることができません。ピボットの平均を計算する

以下の私のクエリです:

select branch, ISNULL([11:00], 0) as [11:00],ISNULL([11:15], 0) as 
[11:15],ISNULL([11:30], 0) as [11:30], ISNULL([11:45], 0) as [11:45], 
ISNULL([12:00], 0) as [12:00] 

from 
( 
select b.branchname 
     ,convert(varchar(5), intervals.interval_start_time, 108) 
     ,sum(b.ordercount) ordercounts 
from branch b cross apply dbo.getDate15MinInterval(CAST(b.TransactionDate 
as date)) as intervals 
where b.TransactionDate >= interval_start_time and b.TransactionDate <= 
interval_end_time 
and CAST(TransactionDate AS date) IN ('2017-07-01','2017-07-08') 

group by DATEPART(WEEKDAY,TransactionDate),b.branchname,intervals.interval_start_time,intervals.interval_end_time 
) t 
pivot (avg(ordercounts) for interval_start_time in ([11:00], [11:15] , 
[11:30], [11:45], [12:00])) as p 

私の元のテーブルがある:上記のクエリから

enter image description here

結果は次のとおりです。

enter image description here

期待される結果:

enter image description here

15minuteintervalクエリの場合、私の元の記事を参照してください。
Group data by interval of 15 minutes and use cross tab

答えて

0

SQL Serverは、整数に整数演算を行います。問題は、これが整数であることです。

sum(b.ordercount) as ordercounts 

(おそらく)です。

だから、浮動小数点数に変換してください。私は通常、1.0を掛けるだけです:

sum(b.ordercount)*1.0 as ordercounts 

しかし、あなたのタイプについては、より具体的にすることができます。

+0

こんにちはゴードン、ちょうど浮動のために働く。しかし、私はまだ出力で1と8を得ています。それは0.5と4でなければなりません。 – Shivang

0

はfloatにキャストしてみ -

AVG(CAST(ordercounts AS FLOAT)) 

SUM(CAST(b.ordercount AS FLOAT)) AS ordercounts 
0

は次のように行うことができます。この例では、私は一つだけ間隔を使用しています 2008のSQL Serverのよう

select branchname, [dayname], ISNULL([11:00], 0) as [11:00], AVG(CAST([11:00] as float)) over() [Avg_11:00] 
from 
(
    select branchname, [dayname], ISNULL([11:00], 0) as [11:00], ISNULL([11:15], 0) as [13:15], ISNULL([11:30], 0) as [11:30], ISNULL([11:45], 0) as [11:45] 
    from 
    ( 
     select intervals.[dayname] 
      , b.branchname 
      , convert(varchar(5), intervals.interval_start_time, 108) interval_start_time -- for hh:mm format 
      , sum(b.ordercount) ordercount 
     from branch b cross apply dbo.getDate15MinIntervals(CAST(b.TransactionDate as date)) as intervals 
     where b.transactiondate between interval_start_time and interval_end_time 
     group by intervals.[dayname], b.branchname, intervals.interval_start_time, intervals.interval_end_time 
    ) t 
    pivot (sum(ordercount) for interval_start_time in ([11:00], [11:15] , [11:30], [11:45])) as p 
) t 
group by branchname, [dayname], [11:00] 

AVG OVER()は有効です。必要なすべてのものに拡張することができます。

私は昨日の回答からいくつかのサンプルデータで試してみました、それは以下のように値を返します。

enter image description here

ハッピーコーディング! :)