ID Event Date 101 in 08/26/2019 101 out 08/28/2019 102 in 08/27/2019 102 out 09/01/2019 Every customer has 2 entries, one for check-in and one for check out. I have to find out the daily average number of guests staying in a date range.
4 Réponses :
Dans la requête ci-dessous, toutes les dates qui n'existent pas dans vos données (aucun check-ins ou check-out) ne seront pas comptées lors du calcul de votre moyenne. Cela devrait être bien si vous savez que vous aurez au moins un événement pour chaque date.
set @checkin_count = 0; set @checkout_count = 0; set @start_date = '2019-08-26'; set @end_date = '2019-09-02'; set @date_diff = datediff(@end_date,@start_date); set @date_counter = 0; select sum(current_guest_count)/datediff(@end_date,@start_date) as avg_num_of_stays from ( select ID ,Event ,case when Event = 'in' then @checkin_count := @checkin_count + 1 when Event = 'out' then @checkout_count := @checkout_count + 1 end ,(@checkin_count - @checkout_count) as current_guest_count ,Date from stays order by Date asc ) a where Date between @start_date and @end_date;
Vous pouvez utiliser pivot pour convertir Remarque: strong> acclamations !! p> p> dans code> et out code> dans colonnes code> alors vous pouvez trouver facilement la moyenne. J'ai trouvé le nombre total d'un client séjournant chaque jour: dates code> subquiery est utilisé pour aller chercher tous les jours entre le début de la plage et la fin. Il est utilisé au cas où aucun client n'a vérifié ou non un jour spécifique, nous devons compter le client comme "séjourné" car le client vérifié avant jour et dehors après quelques jours. P>
Si l'une de la réponse a résolu votre question, s'il vous plaît accepter it, donc que votre question est marquée comme résolue.
Ceci pourrait vous envoyer dans la bonne direction:
with data as (
select ID, min(Date) as checkin, max(Date) as checkout
from T group by ID /* assumes only one stay per customer */
)
select
sum(
datediff(days,
case when @start > checkin then @start else checkin end,
case when @end < checkout then @end else checkout end
) - 1 /* assumes checkout day isn't counted */
) * 1.0 / (datediff(days, @start, @end) - 1)
from data
where @start < checkout and @end > checkin;
J'espère que c'est la solution que vous recherchez. Les étapes sont (1) Créer une liste de dates de la date de début à la date de fin, (2) Créer une ligne pour chaque client avec une date d'entrée et une date (3) utilisée par une jointure extérieure comptez le nombre de clients pour chaque jour. .
with daylist as
(
select convert(datetime, "08/22/2019") as days
union all
select dateadd(dd, 1, days)
from daylist
where days < convert(datetime, "09/03/2019")
)
select d.days, sum(case when t.id is null then 0 else 1 end)
from daylist d
left join
(
select a.id, a.dait as indate, b.dait as outdate
from yourtable a
inner join yourtable b on a.id = b.id
where a.event = "in"
and b.event = "out"
) t
on d.days between convert(datetime, t.indate) and convert(datetime, t.outdate)
group by d.days
Donc, il n'y a pas de confusion, pouvez-vous partager la sortie souhaitée de l'entrée ci-dessus
SQL CODE> est juste une langue utilisée par plusieurs fournisseurs de SGBD. Quel DBMS s'agit-il?Stackoverflow.com/help/how-to-ask Lisez ceci.
La fonction DATE est db dépend donc, veuillez dire à utiliser quel DB vous utilisez vraiment .. et la sortie attendue aussi