-2
votes

Nombre journalier moyen de séjour des invités pour une plage de dates spécifique

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.
sql

4 commentaires

Donc, il n'y a pas de confusion, pouvez-vous partager la sortie souhaitée de l'entrée ci-dessus


SQL 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


4 Réponses :


0
votes

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;


0 commentaires

0
votes

Vous pouvez utiliser pivot pour convertir dans et out dans colonnes alors vous pouvez trouver facilement la moyenne. J'ai trouvé le nombre total d'un client séjournant chaque jour: xxx

Remarque: dates 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.

acclamations !!


1 commentaires

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.



0
votes

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;


0 commentaires

0
votes

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


0 commentaires