Avalados por :

Cómo crear un informe dinámico de estado del cliente en BusinessObjects sin complicaciones

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 2 Vistas
0
Cargando...

Hola, espero que alguien pueda ayudar con esto y pido disculpas si esto ya se ha mencionado antes. Debo destacar que soy relativamente nuevo en BusinessObjects.

Una dimensión clave para nuestro departamento de marketing es el estado del cliente: cuántos clientes nuevos compraron algo en nuestra tienda en línea durante un período de tiempo específico, cuántos clientes nuevos regresaron en este período y cuántos eran clientes existentes. Con este fin, he creado una tabla derivada en la base de datos llamada estado del cliente, de la siguiente manera:

SELECT uni_usr_id,

Código de cliente,

CASE

WHEN Código de cliente = 0 THEN 'Nuevo: Orden Única'

WHEN Código de cliente = 1 THEN 'Nuevo: Múltiples Órdenes'

WHEN Código de cliente = 2 THEN 'Cliente Existente'

ELSE 'Error'

END AS Estado del cliente

FROM

(SELECT uni_usr_id,

CASE

WHEN min_prev = 0 AND no_ords = 1 THEN 0

WHEN min_prev = 0 AND no_ords > 1 THEN 1

WHEN min_prev > 0 THEN 2

ELSE 3

END AS Código de cliente

FROM

(

SELECT

uni_usr_id, min(prev_orders) AS min_prev, count(DISTINCT order_id) AS no_ords

FROM

fact_orders

WHERE fact_orders.order_date BETWEEN @Prompt(Fecha_desde) AND @Prompt(Fecha_hasta)

GROUP BY uni_usr_id) a

) b

ORDER BY Código de cliente

;

prev_orders es solo un campo en la tabla de pedidos, que comienza en 0 para el primer pedido de un cliente. Espero que el resto sea autoexplicativo. Esta tabla derivada está conectada a la tabla de hechos principal a través de uni_usr_id, y las fechas de los avisos se ejecutan una vez para ambas tablas. En la mayoría de los casos, esto funciona muy bien.

Sin embargo, si un usuario del informe desea especificar algo relacionado con el pedido, por ejemplo, el gasto mínimo en un pedido, entonces se complica. Por supuesto, puedes hacer esto para los pedidos reales con una subconsulta, pero esto no afectará el cálculo del estado. Entonces, por ejemplo, si un cliente tuviera 4 pedidos y solo 2 de ellos superaran los €20, entonces el informe principal solo incluiría los €20, pero el cálculo del estado se referiría a todos los pedidos del cliente.

¿Alguien conoce una forma más inteligente de hacer que este tipo de informe sea más dinámico, que no sea agregar muchos filtros al script de la tabla derivada? También puedo replicar el cálculo del estado a través de una variable de informe, pero el problema es que la variable solo funciona a nivel del usuario individual y no parece funcionar a nivel de resumen.

Espero que esto tenga sentido, estaré encantado de proporcionar más información si es necesario. Gracias

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Hola Mark

También había estado pensando en estas líneas. Una solución como esta sería genial, y el tiempo no es un problema, pero el estado del cliente tiene que ver con la relación entre los pedidos en un período de tiempo especificado por el usuario, que siempre cambia.

Entonces, los usuarios finales quieren saber durante un cierto período de tiempo cuántos usuarios eran nuevos y qué proporción regresó a nosotros.

Una posible solución sería decir que los usuarios finales solo pueden informar sobre esa información a través de períodos establecidos, como trimestres; entonces, tu sugerencia sería ideal, ya que podría ejecutar ese cálculo en el ETL. Supongo que bajar al nivel mensual haría que todo fuera demasiado engorroso.

Hasta ahora, la tabla derivada ha funcionado bien, solo cuando se filtra por el valor real del pedido las cosas se complican. Como le dije a Durgamadhab Mishra, podría simplemente agregar un aviso de valor de pedido a la tabla derivada y a la tabla de hechos, para que replique mi SQL aquí:

SELECT

CASE WHEN min_prev = 0 AND ords = 1 THEN 0

WHEN min_prev = 0 AND ords > 1 THEN 1

ELSE 2 END AS KS,

uni_usr_id

FROM

(SELECT uni_usr_id, min(prev_orders) min_prev, count(DISTINCT order_id) ords, sum(`netto_eur`) netto_eur

FROM

fact_orders fo

WHERE fo.order_date BETWEEN '2012-01-01' AND '2012-03-31'

AND EXISTS

(SELECT fo2.order_id, sum(netto_eur) net_eur

FROM fact_orders fo2

WHERE fo.order_id = fo2.order_id

GROUP BY fo2.order_id

HAVING net_eur >= 20)

GROUP BY uni_usr_id) a

ORDER BY KS

;

La ventaja de BusinessObjects aquí es que este aviso solo aparece una vez para el usuario.

Saludos

Richard

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

La otra opción es hacer que la Dimensión del Cliente sea una dimensión de cambio lento y rastrear los cambios en el estado del cliente. Si puedes retroceder esto, entonces vuelve a etiquetar tus claves sustitutas en tu dimensión y en tu hecho. No estoy seguro de cuánto tiempo te han dado para hacer esto, pero esa es una opción.

He hecho algo similar a lo que estás buscando con estados históricos y puede ser un lío, pero como dices, siempre y cuando funcione lo suficientemente bien, no debería ser un problema.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Mark, muchas gracias por la respuesta. Esto es algo que ya he sugerido: tener estado actual del cliente como un valor fijo, ejecutarse en el historial de pedidos en el momento de la ETL nocturna. Probablemente haga algo así pronto de todos modos, ya que ayudará en la planificación de nuevas campañas. Algo como nuevo, activo, inactivo, muy inactivo, premium, etc. Sin problema en la ETL.

Sin embargo, el problema aquí es que el requisito también es para información histórica. Por lo tanto, queremos comparar cuántos clientes nuevos, nuevos y que regresan, y clientes existentes hubo en un período particular, versus el mismo período del año anterior. El usuario de BusObj, por supuesto, necesitaría ejecutar el informe nuevamente para esto. Esto es lo que hacen actualmente, la parte complicada es, como digo, filtrar a nivel de pedido individual. Por ejemplo, quieren saber cuántos clientes nuevos, nuevos y que regresan, y clientes existentes, que gastan €20 por pedido, tuvimos ordenando en el primer trimestre de 2013, versus el primer trimestre de 2012. Y recuentos de pedidos, valor, etc.

Por supuesto, podríamos comparar recuentos de clientes y recuentos de pedidos, obteniendo el valor promedio del pedido por cliente, pero aún así no nos da exactamente lo que necesitamos aquí. También podríamos mantener la información histórica estática, pero los usuarios finales generalmente quieren interactuar con ella de alguna manera, como filtrar por país, etc.

Estoy de acuerdo con lo que dices sobre los costos adicionales para las consultas; sin embargo, me ha sorprendido gratamente el rendimiento. Los usuarios finales también están contentos con esto.

Por supuesto, todo esto es con SQL, y me pregunto si MDX podría proporcionar más flexibilidad aquí.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Sería mejor llevar el código del cliente al nivel de la base de datos.

Agréguelo como una nueva columna en la dimensión del cliente e introduzca algún código ETL para actualizarlo durante la noche o tan seguido como se carguen nuevos pedidos en su base de datos. Hay demasiado sobrecarga en las consultas para que este código se ejecute cada vez que desee informar sobre un objeto tan comúnmente utilizado.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?