Avalados por :

Como criar um relatório dinâmico de status do cliente no BusinessObjects sem complicações

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

Olá, espero que alguém possa ajudar com isso e peço desculpas se isso já foi mencionado antes. Devo destacar que sou relativamente novo no BusinessObjects.

Uma dimensão chave para nosso departamento de marketing é o estado do cliente: quantos novos clientes compraram algo em nossa loja online durante um período de tempo específico, quantos novos clientes retornaram nesse período e quantos eram clientes existentes. Com esse objetivo, criei uma tabela derivada no banco de dados chamada estado do cliente, da seguinte forma:

SELECT uni_usr_id,

Código do cliente,

CASE

WHEN Código do cliente = 0 THEN 'Novo: Pedido Único'

WHEN Código do cliente = 1 THEN 'Novo: Múltiplos Pedidos'

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

ELSE 'Erro'

END AS Estado do 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 do 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(Data_inicial) AND @Prompt(Data_final)

GROUP BY uni_usr_id) a

) b

ORDER BY Código do cliente

;

prev_orders é apenas um campo na tabela de pedidos, que começa em 0 para o primeiro pedido de um cliente. Espero que o restante seja autoexplicativo. Esta tabela derivada está conectada à tabela de fatos principal através de uni_usr_id, e as datas das solicitações são executadas uma vez para ambas as tabelas. Na maioria dos casos, isso funciona muito bem.

No entanto, se um usuário do relatório deseja especificar algo relacionado ao pedido, por exemplo, o gasto mínimo em um pedido, então isso se complica. Claro, você pode fazer isso para pedidos reais com uma subconsulta, mas isso não afetará o cálculo do estado. Então, por exemplo, se um cliente tiver 4 pedidos e apenas 2 deles ultrapassarem os €20, então o relatório principal incluirá apenas os €20, mas o cálculo do estado se referirá a todos os pedidos do cliente.

Alguém conhece uma maneira mais inteligente de tornar esse tipo de relatório mais dinâmico, que não seja adicionar muitos filtros ao script da tabela derivada? Também posso replicar o cálculo do estado por meio de uma variável de relatório, mas o problema é que a variável funciona apenas no nível do usuário individual e não parece funcionar no nível do resumo.

Espero que isso faça sentido, ficarei feliz em fornecer mais informações, se necessário. Obrigado

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

4 Respuestas

0
Cargando...

Olá Mark

Também tenho pensado nessas linhas. Uma solução como essa seria ótima, e o tempo não é um problema, mas o estado do cliente está relacionado com a relação entre os pedidos em um período de tempo especificado pelo usuário, que está sempre mudando.

Assim, os usuários finais querem saber durante um certo período de tempo quantos usuários eram novos e qual a proporção que retornou para nós.

Uma possível solução seria dizer que os usuários finais só podem relatar essa informação através de períodos estabelecidos, como trimestres; então, sua sugestão seria ideal, pois poderia executar esse cálculo no ETL. Suponho que descer para o nível mensal tornaria tudo muito complicado.

Até agora, a tabela derivada tem funcionado bem, apenas quando filtrada pelo valor real do pedido as coisas se complicam. Como mencionei a Durgamadhab Mishra, poderia simplesmente adicionar um aviso de valor do pedido à tabela derivada e à tabela de fatos, para que replique meu SQL aqui:

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

;

A vantagem do BusinessObjects aqui é que este aviso aparece apenas uma vez para o usuário.

Saudações

Richard

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

A outra opção é tornar a Dimensão do Cliente uma dimensão de mudança lenta e rastrear as mudanças no estado do cliente. Se você puder reverter isso, então renomeie suas chaves substitutas na sua dimensão e na sua fato. Não tenho certeza de quanto tempo você tem para fazer isso, mas essa é uma opção.

Eu fiz algo semelhante ao que você está procurando com estados históricos e pode ser confuso, mas como você disse, desde que funcione bem o suficiente, não deveria ser um problema.

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

Olá Mark, muito obrigado pela resposta. Isso é algo que já sugeri: ter estado atual do cliente como um valor fixo, executar no histórico de pedidos no momento do ETL noturno. Provavelmente farei algo assim em breve de qualquer maneira, pois ajudará no planejamento de novas campanhas. Algo como novo, ativo, inativo, muito inativo, premium, etc. Sem problema no ETL.

No entanto, o problema aqui é que o requisito também é para informações históricas. Portanto, queremos comparar quantos clientes novos, novos e recorrentes, e clientes existentes houve em um período específico, em comparação com o mesmo período do ano anterior. O usuário do BusObj, é claro, precisaria executar o relatório novamente para isso. Isso é o que eles fazem atualmente, a parte complicada é, como eu disse, filtrar ao nível do pedido individual. Por exemplo, eles querem saber quantos clientes novos, novos e recorrentes, e clientes existentes, que gastam £20 por pedido, tivemos pedidos no primeiro trimestre de 2013, em comparação com o primeiro trimestre de 2012. E contagens de pedidos, valor, etc.

Claro, poderíamos comparar contagens de clientes e contagens de pedidos, obtendo o valor médio do pedido por cliente, mas ainda assim não nos dá exatamente o que precisamos aqui. Também poderíamos manter as informações históricas estáticas, mas os usuários finais geralmente querem interagir com ela de alguma forma, como filtrar por país, etc.

Concordo com o que você disse sobre os custos adicionais para as consultas; no entanto, fiquei agradavelmente surpreso com o desempenho. Os usuários finais também estão satisfeitos com isso.

Claro, tudo isso é com SQL, e estou me perguntando se o MDX poderia fornecer mais flexibilidade aqui.

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

Seria melhor levar o código do cliente para o nível do banco de dados.

Adicione-o como uma nova coluna na dimensão do cliente e insira algum código ETL para atualizá-lo durante a noite ou tão frequentemente quanto novos pedidos forem carregados em seu banco de dados. Há uma sobrecarga muito grande nas consultas para que esse código seja executado toda vez que você deseja relatar um objeto tão comumente usado.

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?