Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Como utilizar LOAD para contar y clasificar clientes segun numero de albaranes?

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

1 Solution

Accepted Solutions
Not applicable
Author

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.

View solution in original post

6 Replies
Miguel_Angel_Baeyens

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

Not applicable
Author

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

chematos
Specialist II
Specialist II

Hola Jose,

Fíjate que pusiste LOAD Count(IdCliente) AS NumCli en lugar de LOAD Count(IdCliente) AS NumAlb

Saludos,

Chema

Not applicable
Author

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

chematos
Specialist II
Specialist II

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.

Not applicable
Author

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.