Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > SQL Server

Respuesta
 
Herramientas Desplegado
Antiguo 28-jun-2007, 06:55   #1 (permalink)
carlangas07 ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2007
Mensajes: 12
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
carlangas07 está desconectado   Responder Citando
Antiguo 30-jun-2007, 17:54   #2 (permalink)
tomerqueves está en el buen camino
 
Avatar de tomerqueves
 
Fecha de Ingreso: marzo-2005
Mensajes: 84
Enviar un mensaje por MSN a tomerqueves
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.
__________________
programare
tomerqueves está desconectado   Responder Citando
Antiguo 01-jul-2007, 10:20   #3 (permalink)
Gabo77 sólo puede mejorar
 
Avatar de Gabo77
 
Fecha de Ingreso: noviembre-2006
Mensajes: 352
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!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....

Última edición por Gabo77; 01-jul-2007 a las 10:24. Razón: Jeje, despues de todo si tenia error.... :p
Gabo77 está desconectado   Responder Citando
Antiguo 01-jul-2007, 11:43   #4 (permalink)
carlangas07 ha deshabilitado el karma
 
Fecha de Ingreso: febrero-2007
Mensajes: 12
Re: Cálculo de días transcurridos entre dos últimos pedidos

Cita:
Iniciado por Gabo77 Ver Mensaje
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.


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.
carlangas07 está desconectado   Responder Citando
Antiguo 22-ago-2007, 11:20   #5 (permalink)
poless ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2007
Mensajes: 1
De acuerdo 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???
poless está desconectado   Responder Citando
Antiguo 22-ago-2007, 16:27   #6 (permalink)
Gabo77 sólo puede mejorar
 
Avatar de Gabo77
 
Fecha de Ingreso: noviembre-2006
Mensajes: 352
Re: Cálculo de días transcurridos entre dos últimos pedidos

Cita:
Iniciado por carlangas07 Ver Mensaje
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.


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
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
Gabo77 está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 14:39.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93