gileswalker
Hola a todos,
He estado atascado en este problema durante unos días y probablemente estoy pensando demasiado, así que espero que alguien pueda proporcionar una solución ordenada.
He creado algunos datos ficticios para un hotel y necesito calcular las tasas de ocupación (habitaciones totales/habitaciones llenas). El total de habitaciones es de 48, aquí están los datos:
Room_ID | Invitado_ID | Fecha de | fecha_hasta |
109 | 74 | 1/01/2016 | 01/06/2016 |
217 | 85 | 1/01/2016 | 01/05/2016 |
210 | dieciséis | 1/01/2016 | 01/06/2016 |
116 | 53 | 1/01/2016 | 01/05/2016 |
209 | 129 | 1/01/2016 | 01/03/2016 |
214 | 82 | 2/01/2016 | 01/03/2016 |
215 | 96 | 2/01/2016 | 01/03/2016 |
204 | 13 | 2/01/2016 | 7/01/2016 |
108 | 18 | 01/03/2016 | 01/06/2016 |
115 | 101 | 01/05/2016 | 8/01/2016 |
207 | 12 | 01/05/2016 | 7/01/2016 |
104 | 23 | 01/06/2016 | 7/01/2016 |
403 | 138 | 7/01/2016 | 01/12/2016 |
111 | 15 | 7/01/2016 | 01/11/2016 |
404 | 131 | 7/01/2016 | 01/12/2016 |
106 | 95 | 7/01/2016 | 01/12/2016 |
304 | 95 | 8/01/2016 | 01/09/2016 |
302 | 17 | 8/01/2016 | 13/01/2016 |
212 | 109 | 01/09/2016 | 01/12/2016 |
302 | 4 | 01/09/2016 | 14/01/2016 |
Es una tabla bastante sencilla. Sin embargo, mi problema es si quiero calcular la tasa de ocupación en un día, semana, mes o año, cómo obtener una fórmula dax para calcular los días entre date_from y date_to. Pensé que podría hacerse con el número total de días en el marco de tiempo relevante, sin embargo, estaría interesado en ver las ideas de las comunidades.
El informe tiene una clave de fecha con fechas continuas y todas las semanas, meses, etc. relevantes. Esto está vinculado a través de la columna Fecha_desde.
Gracias,
Giles
rdurkin
Creo que lo tengo resuelto para ti:
Agregue una columna de índice a su tabla de Reservas, ya que asumo que GuestID se refiere a una persona específica y esa persona puede reservar varias habitaciones a la vez o durante un período de tiempo determinado.
Agregue una dimensión de fecha.
Su modelo debe verse como el siguiente:
Crea las siguientes medidas:
Habitaciones Ocupadas:=CALCULAR(DISTINCTCOUNT(Reservas[Index Column]), Filtro (Reservas,[Date_from]<=ÚLTIMA FECHA(DimDate[Date])&&[Date_to]>=FIRSTDATE(DimDate[Date])))
Habitaciones Disponibles (Total para Fechas Seleccionadas):=CALCULAR(DISTINCTCOUNT(DimDate[Date]))*48
Total de fechas reservadas:=CALCULAR(DISTINCTCOUNT(DimDate[Date]),Reservaciones)
Habitaciones Totales Ocupadas:=SUMX(Reservas,[Rooms Occupied]*[Total Dates Booked])
Tasa de ocupación:=DIVIDIR([Total Rooms Occupied],[Rooms Available (Total for Selected Dates)])
O
Tasa de ocupación:=DIVIDIR([Total Rooms Occupied],[Rooms Available (Total for Selected Dates)])*DIVIDIR([Rows in Bookings],[Rows in Bookings])
Ejemplos de tablas dinámicas:
Márquelo como una solución o dé un kudo si funciona para usted, de lo contrario, avíseme si se encuentra con un problema y haré todo lo posible para ayudarlo. Vaya a bipatterns.com para obtener más técnicas y guías de usuario.
Gracias,
ryan durkin
edinvz
No estoy seguro si el problema es demasiado complejo o te confundí.
Si alguien está dispuesto a ayudar, proporcionaré más detalles.
Edín
edinvz
Gracias por sus respuestas @GilesWalker y @Ashish_Mathur, son muy apreciadas.
Intenté usar la fórmula provista para crear una medida, pero arroja el error que experimenté con otros intentos de crear esta medida:
‘La expresión se refiere a múltiples columnas. Varias columnas no se pueden convertir a un valor escalar.’
Podría estar aplicándolo de manera incorrecta, pero también parece que la cuestión de cómo se ve mi tabla de datos como lo señala @Ashish_Mathur puede ser útil.
Mi tabla de datos inicial contiene filas para cada reserva por habitación (litera), cliente, producto, fecha de inicio y fecha de finalización.
Identificación | Muelle__c | End_Day__c | Inicio_día__c | Productos__c | ID de la cuenta |
a4jb0 | a4Kb0 | 16-06-16 | 15-06-16 | a7jb0 | |
a4jb0 | a4Kb0 | 23-09-17 | 22-09-17 | a7jb0 | |
a4jb0 | a4Kb0 | 23-09-17 | 22-09-17 | a7jb0 | |
a4jb0 | a4Kb0 | 24-09-17 | 23-09-17 | a7jb0 | |
a4jb0 | a4Kb0 | 20-06-16 | 15-06-16 | a7jb0 | |
a4jb0 | a4Kb0 | 15-08-17 | 13-08-17 | a7jb0 | |
a4jb0 | a4Kb0 | 03-08-17 | 02-08-17 | a7jb0 | |
a4jb0 | a4Kb0 | 16-06-16 | 15-06-16 | a7jb0 |
Obviamente, todos los valores aparecen muchas veces, ya que el conjunto de datos contiene pocos años de reservas.
Editar: lo que estoy tratando de obtener es la ocupación por mes y duración, por ejemplo, el ejemplo de duración de ocupación para un período se presenta a continuación. Las columnas Recuento y Área, así como la longitud de las literas, se agregan a la tabla de datos de las tablas relacionadas. La pregunta principal es cómo encontrar el recuento Occ basado en la tabla de datos.
Longitud | Contar | Área | Recuento ocupacional | área ocupacional | Recuento de % de ocupación | % área ocupada |
6 | 8 | 144 | 6.40 | 115.20 | 80% | 80% |
7 | 10 | 210 | 8.00 | 168.00 | 80% | 80% |
12 | 30 | 1,440 | 24.00 | 1,152.00 | 80% | 80% |
13.5 | 20 | 1,080 | 16.00 | 864.00 | 80% | 80% |
15 | 30 | 2,250 | 24.00 | 1,800.00 | 80% | 80% |
17 | 20 | 1,700 | 16.00 | 1,360.00 | 80% | 80% |
18 | 10 | 1,080 | 8.00 | 864.00 | 80% | 80% |
Gracias de antemano y avísame si puedo ayudarte con alguna información adicional.
Edín
Ashish_Mathur
En respuesta a edinvz
Hola,
No entiendo cómo ha calculado los números en la columna Occ Count. Por favor explique en detalle.
edinvz
En respuesta a Ashish_Mathur
Mis disculpas por no ser lo suficientemente claro.
Esa información proviene de una tabla diferente. Pero como dije, la atención se centra en el recuento de literas ocupadas y esa es la única información que se calculará. en base a la tabla de datos presentada.
Espero que ahora tenga más sentido.
¡Muchas gracias!
Edín
Ashish_Mathur
En respuesta a edinvz
Sigo sin entender. ¿Cómo ha calculado los números en la columna Occ Count? ¿Cómo llegaste a los números: 6.4,8,24, etc.?
edinvz
En respuesta a Ashish_Mathur
Eso es exactamente lo que quiero obtener: la segunda tabla es el resultado que busco. Mi pregunta es cómo crear una medida que calcule el recuento de ocupación en función de la primera tabla (tabla de datos que contiene reservas y todas las funciones relacionadas).
edinvz
Estimados profesionales de Power BI 🙂
He intentado descifrar este durante algún tiempo y todavía no puedo obtener lo que necesito.
Quiero obtener la medida que calcularía la cantidad de habitaciones ocupadas cada día, pero también obtener la cantidad promedio de habitaciones ocupadas cuando se agrega a una base mensual y anual.
Lo he resuelto creando la Columna Calculada usando la medida [Rooms Occupied] proporcionada por rdurkin y luego promediada. Funciona bien para la ocupación total, pero la espera no permite segmentar por diferentes segmentos, por ejemplo, producto, tipo de habitación, tamaño y similares.
Agradecería si alguien pudiera intentar sugerir una solución para el problema descrito anteriormente.
Y en caso de que haya alguna diferencia, estoy trabajando en Excel Power Pivot, en lugar de Power BI.
Gracias de antemano y espero ver cuán geniales pueden ser las medidas de Dax.
Edín
Ashish_Mathur
En respuesta a edinvz
Hola @edinvz,
Comparta el enlace desde donde puedo descargar su libro de Excel y también el resultado esperado allí.
gileswalker
En respuesta a edinvz
@edinvz: logré encontrar una solución a esto y la he usado varias veces y funciona bien:
Tabla Diaria =
FILTRO (
CROSSJOIN (Tabla 1, CALENDARIO AUTOMÁTICO ()),
Tabla 1[date_from] <= [Date]
&& [Date]
<=
Fecha de finalización del VAR = Tabla 1[date_to]
REGRESO
SI ( Fecha de finalización = EN BLANCO (), HOY (), Fecha de finalización )
)
rdurkin
Creo que lo tengo resuelto para ti:
Agregue una columna de índice a su tabla de Reservas, ya que asumo que GuestID se refiere a una persona específica y esa persona puede reservar varias habitaciones a la vez o durante un período de tiempo determinado.
Agregue una dimensión de fecha.
Su modelo debe verse como el siguiente:
Crea las siguientes medidas:
Habitaciones Ocupadas:=CALCULAR(DISTINCTCOUNT(Reservas[Index Column]), Filtro (Reservas,[Date_from]<=ÚLTIMA FECHA(DimDate[Date])&&[Date_to]>=FIRSTDATE(DimDate[Date])))
Habitaciones Disponibles (Total para Fechas Seleccionadas):=CALCULAR(DISTINCTCOUNT(DimDate[Date]))*48
Total de fechas reservadas:=CALCULAR(DISTINCTCOUNT(DimDate[Date]),Reservaciones)
Habitaciones Totales Ocupadas:=SUMX(Reservas,[Rooms Occupied]*[Total Dates Booked])
Tasa de ocupación:=DIVIDIR([Total Rooms Occupied],[Rooms Available (Total for Selected Dates)])
O
Tasa de ocupación:=DIVIDIR([Total Rooms Occupied],[Rooms Available (Total for Selected Dates)])*DIVIDIR([Rows in Bookings],[Rows in Bookings])
Ejemplos de tablas dinámicas:
Márquelo como una solución o dé un kudo si funciona para usted, de lo contrario, avíseme si se encuentra con un problema y haré todo lo posible para ayudarlo. Vaya a bipatterns.com para obtener más técnicas y guías de usuario.
Gracias,
ryan durkin
yggdrasil
En respuesta a rdurkin
¿Alguna idea de cómo llenar los espacios en blanco?
Por ejemplo, debería haber 5 el 7 y 9 hasta septiembre…
Ashish_Mathur
En respuesta a yggdrasil
Hola,
Explique la pregunta y comparta los datos (en un formato que se pueda pegar en un archivo de Excel)
yggdrasil
En respuesta a Ashish_Mathur
Estoy usando la solución propuesta por @rdurkin y obtengo espacios en blanco donde no hay nadie que se registre.
Todo lo demás es correcto, solo necesito que los números sean acumulativos
gileswalker
En respuesta a rdurkin
@rdurkin: gracias por su ayuda con esto, su solución funcionó, ya que tiene en cuenta el total de días disponibles para las habitaciones y luego usa el recuento real de tiempo que se reserva una habitación.
@sdjensen: gracias por su ayuda con esto, acertó en que debe tener en cuenta los días disponibles en comparación con los días reservados por habitación.
@KHorseman: gracias por toda la ayuda con esto y por aclarar qué estaban haciendo las medidas.
gileswalker
En respuesta a gileswalker
@KHorseman: al tener algunos problemas con esta consulta nuevamente, resultó que los números no se calculaban correctamente y parte de la fórmula que proporcionó funcionó con algunos ajustes para darme el total de días reservados. Para calcular el total de días reservados estoy usando esto:
Días incluidos reservados = SUMX(
FILTRO(Reservas, Reservas[Date_from] <= ÚLTIMA FECHA (clave de fecha[Date]) && Reservaciones[Date_to] >= PRIMERA FECHA (Clave de fecha[Date])),
CUENTAS(FECHAS ENTRE (Clave de fecha[Date],Reservaciones[Date_from],Reservaciones[Date_to])))
El problema con el que me encuentro es con los informes sobre períodos de tiempo. Si tengo una habitación reservada del 30 de enero al 4 de febrero, eso significa que en enero había dos días reservados y en febrero cuatro días reservados. Sin embargo, la fórmula anterior dice reservado para seis días, lo cual es correcto; sin embargo, asigna esos seis días al mes al que tengo vinculada la relación datekey (es decir, si date_from es en enero, entonces enero obtiene los seis días). He intentado cambiar la relación de la tabla DateKey para que se vincule a Date_from y Date_to en la tabla de reservas, no hace ninguna diferencia.
¿Hay algún filtro que se pueda usar para que, al filtrar por mes/semana/trimestre, etc., una medida calcule solo los días del mes? En este ejemplo, enero tendría dos días asignados (30 y 31 de enero) y febrero tendría cuatro días (1-4 de febrero).
Aquí hay una imagen de lo que estoy tratando actualmente:
Gracias,
Giles
KJinete
En respuesta a gileswalker
@GilesWalker Para cualquiera de las soluciones que sugerí, no debería haber ninguna relación entre Bookings y DateKey. Cualquier relación romperá estos patrones de medida de duración. A partir de ahí, deberías poder usar esto:
Inclusive Days Booked = SUMX( FILTER( Bookings, Bookings[Date_from] <= LASTDATE(DateKey[Date]) && Bookings[Date_to] >= FIRSTDATE(DateKey[Date]) ), CALCULATE( DISTINCTCOUNT(DateKey[Date]), DATESBETWEEN( DateKey[Date], Bookings[Date_from], Bookings[Date_to] ) ) )
Esto solo funciona de manera sensata si solo tiene una habitación seleccionada a la vez, o si hace algo como un gráfico de barras agrupadas con room_ID como leyenda. De lo contrario, el mismo día se contará varias veces, una vez por cada habitación que esté ocupada durante el período de tiempo. Pero su captura de pantalla parece que es solo para una habitación a la vez de todos modos.
Estoy bastante seguro de que poner un CALCULATE dentro de un SUMX es una especie de pecado DAX, pero puedo vivir con eso.
rdurkin
@GilesWalker
Esta es una petición bastante interesante. Si tiene un archivo de Excel ficticio disponible, estaré encantado de proporcionarle una solución. Adjuntarlo aquí si es posible. Para ayudar, necesitaré una mejor comprensión del modelo de datos en este caso.
gileswalker
En respuesta a rdurkin
@rdurkin feliz, ¿cómo hago eso?
KJinete
En respuesta a gileswalker
@GilesWalker Para que no tenga que leer ese otro hilo para elegir la mejor de las soluciones ofrecidas, le recomiendo lo siguiente:
Primero, esa relación entre Date_from y la tabla de fechas. No debe haber relaciones de tabla para que esto funcione. Nuevamente, vea ese otro hilo para más detalles. Entonces aquí está su medida de ocupación:
Ocupación = CALCULAR(
DISTINCTCOUNT(NombreTabla[Room_ID]),
FILTRAR(
Nombre de la tabla,
Nombre de la tabla[Date_from] <= ÚLTIMA FECHA (Tabla de fechas[Date]) &&
Nombre de la tabla[Date_to] >= PRIMERA FECHA(Tabla de Fechas[Date])
)
)
Puede colocar cualquier período de tiempo de la tabla de fechas al lado de esta medida y funcionará. Un mes, una semana, un solo día… Lo tengo contando cada habitación solo una vez, pero es posible que desee hacer un conteo distinto de invitados si desea contar la misma habitación varias veces si está ocupada varias veces en un período. O podría hacer un conteo regular de habitaciones en lugar de un conteo distinto. Depende de sus necesidades específicas.
gileswalker
En respuesta a KJinete
Gracias @KHorseman. Acabo de terminar de leer la información en su enlace y su idea parece agradable y limpia. Una vez que me ponga a trabajar en un par de horas, probaré tanto la idea tuya como la de @Sean para ver qué funciona mejor.
Responderé con lo que he hecho.
Giles