2017-07-18 8 views
0

Ich versuche, den Durchschnitt mit Hilfe von Pivot zu finden, aber nicht in der Lage, die richtige Lösung zu finden.Berechnung Durchschnitt mit Pivot

Die unten ist meine Frage:

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 

Meine ursprüngliche Tabelle ist:

enter image description here

Ergebnis aus der obigen Abfrage ist:

enter image description here

Erwartetes Ergebnis:

enter image description here

Für 15minuteinterval Abfrage, bitte meinen ursprünglichen Beitrag verweisen:
Group data by interval of 15 minutes and use cross tab

Antwort

0

SQL Server tut Integer-Arithmetik-Operationen auf ganze Zahlen. Das Problem ist, dass dies eine ganze Zahl ist:

sum(b.ordercount) as ordercounts 

(vermutlich).

Also, machen Sie es einfach zu einer Fließkommazahl. Normalerweise multipliziere ich einfach mit 1,0:

Aber Sie können spezifischer über Ihre Typen sein, wenn Sie möchten.

+0

Hallo Gordon, das funktioniert nur zum Floaten. Aber ich bekomme immer noch 1 und 8 in der Ausgabe. Es sollte 0,5 und 4 sein. – Shivang

0

Versuchen zu schweben Casting -

AVG(CAST(ordercounts AS FLOAT)) 

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

kann wie folgt geschehen:

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() ist gültig ab SQL Server 2008 nur In diesem Beispiel habe ich ein Intervall verwendet, aber Sie kann es auf alle diejenigen erweitern, die Sie brauchen.

Ich habe versucht, mit einigen Beispieldaten aus Antwort von gestern und es gibt Werte wie folgt:

enter image description here

Glücklich Codierung! :)

Verwandte Themen