Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Tengo una select:
SELECT a1.idCliente, datepart(year, a1.Fecha) as Año, datepart(month, a1.Fecha) as Mes, count(*) as NumAlb
FROM Albaranes a1
GROUP BY a1.Cliente, datepart(year, a1.Fecha), datepart(month, a1.Fecha)
Ahora quería clasificar estos clientes segun frecuencia:
Frecuencia:
LOAD * INLINE [
Desde, Hasta, Frecuencia
0,1, NuevaCompra
2,4, Esporadico
5,10, Ocasional
11,20, Frecuente
21,9999, MuyFrecuente
]
Y yo he intentado pero no lo consigo de ninguna manera esto:
LOAD count(idCliente),
CASE
WHEN NumAlb < 1 THEN NuevaCompra
WHEN NumAlb < 5 THEN Esporadico
WHEN NumAlb < 10 THEN Ocasional
WHEN NumAlb < 20 THEN Frecuente
ELSE 'MuyFrecuente'
END as Frecuencia
Resident Albaranes
Group By Frecuencia
Gracias a todos por vuestra ayuda Miguel ha estado cerca, pero no me explique bien... la solución era:
FrecuenciaClientes:
LOAD *,
If(NumAlb < 1, 'Nueva Compra',
If(NumAlb < 5, 'Esporadico',
If(NumAlb < 10, 'Ocasional',
If(NumAlb < 20, 'Frecuente',
'Muy Frecuente'
)))) AS Frecuencia;
SELECT a1.idCliente, datepart(year, a1.Fecha) as Año, datepart(month, a1.Fecha) as Mes, count(*) as NumAlb
FROM Albaranes a1
GROUP BY a1.Cliente, datepart(year, a1.Fecha), datepart(month, a1.Fecha)
Como el campo lo calculaba en la select sólo necesitaba añadir el filtro antes de la misma.
Hola,
Hay varias maneras. La primera es la más básica y posiblemente sea suficiente, que es utilizando un If():
FrecuenciaClientes:
LOAD *,
If(NumAlb < 1, 'Nueva Compra',
If(NumAlb < 5, 'Esporadico',
If(NumAlb < 10, 'Ocasional',
If(NumAlb < 20, 'Frecuente',
'Muy Frecuente'
)))) AS Frecuencia;
LOAD Count(idCliente) AS NumAlb
RESIDENT Albaranes
GROUP BY Frecuencia;
La segunda es haciendo uso de la función IntervalMatch() como puedes ver en este ejemplo o este otro ejemplo.
Espero que alguna de las dos te sirva.
Miguel
Gracias Miguel Angel por responder tan rápido,
He probado tu código y me da error
FrecuenciaClientes:
LOAD *,
If(NumAlb < 1, 'Nueva Compra',
If(NumAlb < 5, 'Esporadico',
If(NumAlb < 10, 'Ocasional',
If(NumAlb < 20, 'Frecuente',
'Muy Frecuente'
)))) AS Frecuencia;
LOAD Count(idCliente) AS NumCli
RESIDENT Albaranes
GROUP BY Frecuencia;
Error:
Campo no encontrado - <NumAlb>
LOAD Count(IdCliente) AS NumCli
RESIDENT Albaranes
GROUP BY Frecuencia
Hola Jose,
Fíjate que pusiste LOAD Count(IdCliente) AS NumCli en lugar de LOAD Count(IdCliente) AS NumAlb
Saludos,
Chema
Me había dado cuenta, pero el campo que tengo q filtrar por frecuencia es NumAlb que lo cuento en la select.
SELECT a1.idCliente, datepart(year, a1.Fecha) as Año, datepart(month, a1.Fecha) as Mes, count(*) as NumAlb
La nueva tabla debe contener:
count(IdCliente) , Frecuencia
Y para esto debo "transformar" el campo count(*) as NumAlb
Yo primero crearía la tabla Albaranes con la select que tienes definida renombrando los campos como quieras:
Albaranes:
Load *
SELECT a1.idCliente, datepart(year, a1.Fecha) as Año, datepart(month, a1.Fecha) as Mes, count(*) as NumAlb
FROM Albaranes a1
GROUP BY a1.Cliente, datepart(year, a1.Fecha), datepart(month, a1.Fecha);
Y una vez conseguidos los NumAlb por cliente, crearía la tabla de frecuencias:
FrecuenciaClientes:
LOAD *,
If(NumAlb < 1, 'Nueva Compra',
If(NumAlb < 5, 'Esporadico',
If(NumAlb < 10, 'Ocasional',
If(NumAlb < 20, 'Frecuente',
'Muy Frecuente'
)))) AS Frecuencia,
Count(idCliente) AS NumAlb
RESIDENT Albaranes
GROUP BY Frecuencia;
Dime si te funciona.
Gracias a todos por vuestra ayuda Miguel ha estado cerca, pero no me explique bien... la solución era:
FrecuenciaClientes:
LOAD *,
If(NumAlb < 1, 'Nueva Compra',
If(NumAlb < 5, 'Esporadico',
If(NumAlb < 10, 'Ocasional',
If(NumAlb < 20, 'Frecuente',
'Muy Frecuente'
)))) AS Frecuencia;
SELECT a1.idCliente, datepart(year, a1.Fecha) as Año, datepart(month, a1.Fecha) as Mes, count(*) as NumAlb
FROM Albaranes a1
GROUP BY a1.Cliente, datepart(year, a1.Fecha), datepart(month, a1.Fecha)
Como el campo lo calculaba en la select sólo necesitaba añadir el filtro antes de la misma.