Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   SQL Server (http://www.forosdelweb.com/f87/)
-   -   Cálculo de días transcurridos entre dos últimos pedidos (http://www.forosdelweb.com/f87/calculo-dias-transcurridos-entre-dos-ultimos-pedidos-501523/)

carlangas07 28/06/2007 06:55

Cálculo de días transcurridos entre dos últimos pedidos
 
Tengo dos tablas: Clientes y Pedidos y quiero hallar la diferencia de días de los dos últimos pedidos de todos los clientes. (en caso de que tengan dos o más pedidos, evidentemente)

Me gustaría almacenar el valor en un campo de la tabla Clientes para así tener dicha información más a mano, recorriendo todos los registros mediante un procedimiento almacenado que se ejecutaría a la hora de crear unos informes.

¿es sencillo?

Gracias de antemano

tomerqueves 30/06/2007 17:54

Re: Cálculo de días transcurridos entre dos últimos pedidos
 
Sí es muy sencillo. Yo de antemano te digo que quizás no sabría hacerlo en la práctica pero en teoría es sencillamente un campo calculado.
en teoría el campo tres sería el resultado de al campo dos restarle el campo uno(sin entrar en la condición de k las fechas sean validas y dos.)

Yo se hacerlo en acces :D. En sql server con el editor de consultas debe ser tambien sencillito.

Gabo77 01/07/2007 10:20

Re: Cálculo de días transcurridos entre dos últimos pedidos
 
Quizas esto te ayude:
Código:

SELECT C.Nombre, DATEDIFF(DAY, PMax.FechaPedido, PMin.FechaPedido) AS Diferencia
FROM Clientes C
INNER JOIN (/*Esta sentencia me traerá el último pedido de cada cliente*/
    SELECT MAX(FechaPedido) AS FechaPedido, IdCliente
    FROM Pedidos P
    GROUP BY P.IdCliente
) AS PMax
    ON C.IdCliente = PMax.IdCiente
INNER JOIN (
    SELECT MAX(FechaPedido) AS FechaPedido, IdCliente
    FROM Pedidos P
    WHERE NOT EXISTS(/*Esta sentencia hara que no me considere el registro
            mayor y seleccione el segundo mayor, si es que existe*/
        SELECT 1
        FROM Pedidos PA
        WHERE PA.IdCliente = P.IdCliente
            AND MAX(PA.FechaPedido) = P.FechaPedido
        GROUP BY PA.IdCliente
    )
    GROUP BY P.IdCliente
) AS PMin
    ON C.IdCliente = PMax.IdCliente

No la probe, así que uizas tenga uno que otro errorcillo, además de que no se la estructura de tus tablas


Saludos!

carlangas07 01/07/2007 11:43

Re: Cálculo de días transcurridos entre dos últimos pedidos
 
Cita:

Iniciado por Gabo77 (Mensaje 2054151)
Quizas esto te ayude:
Código:

SELECT C.Nombre, DATEDIFF(DAY, PMax.FechaPedido, PMin.FechaPedido) AS Diferencia
FROM Clientes C
INNER JOIN (/*Esta sentencia me traerá el último pedido de cada cliente*/
    SELECT MAX(FechaPedido) AS FechaPedido, IdCliente
    FROM Pedidos P
    GROUP BY P.IdCliente
) AS PMax
    ON C.IdCliente = PMax.IdCliente
INNER JOIN (
    SELECT MAX(FechaPedido) AS FechaPedido, IdCliente
    FROM Pedidos P
    WHERE NOT EXISTS(/*Esta sentencia hara que no me considere el registro
            mayor y seleccione el segundo mayor, si es que existe*/
        SELECT 1
        FROM Pedidos PA
        WHERE PA.IdCliente = P.IdCliente
            AND MAX(PA.FechaPedido) = P.FechaPedido
        GROUP BY PA.IdCliente
    )
    GROUP BY P.IdCliente
) AS PMin
    ON C.IdCliente = PMax.IdCliente

No la probe, así que uizas tenga uno que otro errorcillo, además de que no se la estructura de tus tablas


Saludos!

Había un leve error (marcado en negrita), pero corregido éste, al ejecutar la consulta me da el siguiente error:

No puede aparecer un agregado en la clausula WHERE si no es en una subconsulta contenida en una cláusula HAVING, o en una lista de selección, y siempre que la columna agregada sea una referencia externa.:neurotico


Y la consulta se queda en esto:

Código:

SELECT    C.nombre, DATEDIFF([DAY], PMax.FechaPedido, PMin.FechaPedido) AS Diferencia
FROM        dbo.clientes C INNER JOIN
                          (SELECT    MAX(FechaPedido) AS FechaPedido, IdCliente
                            FROM          Pedidos P
                            GROUP BY P.IdCliente) PMax ON C.idcliente = PMax.IdCliente INNER JOIN
                          (SELECT    MAX(FechaPedido) AS FechaPedido, IdCliente
                            FROM          Pedidos P
                            WHERE      NOT EXISTS
                                                      (SELECT    1
                                                        FROM          Pedidos PA
                                                        WHERE      PA.IdCliente = P.IdCliente AND MAX(PA.FechaPedido) = P.FechaPedido
                                                        GROUP BY PA.IdCliente)
                            GROUP BY P.IdCliente) PMin ON C.idcliente = PMax.IdCliente

La verdad es que esto me sobrepasa bastante, tengo unos conocimientos muy limitados de SQL y no entiendo ni lo que me está diciendo el error.

Gracias de todas maneras, intentaré investigar a ver si encuentro la solución.

poless 22/08/2007 11:20

Re: Cálculo de días transcurridos entre dos últimos pedidos
 
Amiwo tomerqueves, dices tu esa diferencia lo puedes hacer en acces, yo tengo un problema similar, me gustaría que expusieras tu posible solución, como explicó carlangas07 no todos tienen la misma cantidad de pedidos, como harías esto en access???

Gabo77 22/08/2007 16:27

Re: Cálculo de días transcurridos entre dos últimos pedidos
 
Cita:

Iniciado por carlangas07 (Mensaje 2054202)
Había un leve error (marcado en negrita), pero corregido éste, al ejecutar la consulta me da el siguiente error:

No puede aparecer un agregado en la clausula WHERE si no es en una subconsulta contenida en una cláusula HAVING, o en una lista de selección, y siempre que la columna agregada sea una referencia externa.:neurotico


Y la consulta se queda en esto:

Código:

SELECT    C.nombre, DATEDIFF([DAY], PMax.FechaPedido, PMin.FechaPedido) AS Diferencia
FROM        dbo.clientes C INNER JOIN
                          (SELECT    MAX(FechaPedido) AS FechaPedido, IdCliente
                            FROM          Pedidos P
                            GROUP BY P.IdCliente) PMax ON C.idcliente = PMax.IdCliente INNER JOIN
                          (SELECT    MAX(FechaPedido) AS FechaPedido, IdCliente
                            FROM          Pedidos P
                            WHERE      NOT EXISTS
                                                      (SELECT    1
                                                        FROM          Pedidos PA
                                                        WHERE      PA.IdCliente = P.IdCliente AND MAX(PA.FechaPedido) = P.FechaPedido
                                                        GROUP BY PA.IdCliente)
                            GROUP BY P.IdCliente) PMin ON C.idcliente = PMax.IdCliente

La verdad es que esto me sobrepasa bastante, tengo unos conocimientos muy limitados de SQL y no entiendo ni lo que me está diciendo el error.

Gracias de todas maneras, intentaré investigar a ver si encuentro la solución.



Ohh!! bueno, nadie es perfecto.... sobre todo yo!!
Sorry por la cageteada.... el error es sencillo de resolver.... espero que esto quede bien Saludos!


Código:

SELECT C.Nombre, DATEDIFF(DAY, PMax.FechaPedido, PMin.FechaPedido) AS Diferencia
FROM Clientes C
INNER JOIN (/*Esta sentencia me traerá el último pedido de cada cliente*/
    SELECT MAX(FechaPedido) AS FechaPedido, IdCliente
    FROM Pedidos P
    GROUP BY P.IdCliente
) AS PMax
    ON C.IdCliente = PMax.IdCiente
INNER JOIN (
    SELECT MAX(FechaPedido) AS FechaPedido, IdCliente
    FROM Pedidos P
    WHERE NOT EXISTS(/*Esta sentencia hara que no me considere el registro
            mayor y seleccione el segundo mayor, si es que existe*/
        SELECT 1
        FROM Pedidos PA
        WHERE PA.IdCliente = P.IdCliente
        HAVING MAX(PA.FechaPedido) = P.FechaPedido
        GROUP BY PA.IdCliente
    )
    GROUP BY P.IdCliente
) AS PMin
    ON C.IdCliente = PMax.IdCliente



La zona horaria es GMT -6. Ahora son las 13:01.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.