none
consulta que se me resiste RRS feed

  • Pregunta

  • Hola a todos, estoy haciendo una base de datos para llevar los registros de la traida de aguas de mi barrio. Necesito hacer una consulta que se me resiste; a ver si alguien me puede ayudar.

    La consulta quiero que me cree una tabla auxiliar que contenga lo siguiente:
    dni,barrio, numerocasa, fechaA, fechaB,diasentremediciones, litrosconsumidos.

    Para que se entienda, si en un año hacemos 12 mediciones(una por mes) en 3 casas diferentes, la tabla debera tener 12 entradas por casa, donde a cada medición se le reste la anterior para saber los litros consumidos por cada mes en cada casa.

    Adjunto la imagen de las relaciones.

    Gracias
    sábado, 30 de septiembre de 2017 14:37

Respuestas

  • Buenas,

    No había visto la imagen,

    no soy experto en SQL Server, asi que puede que esrta consulta tenga mil errores, pero puedes probar a ver que tal te va:

    DECLARE @año integer = 2017;  
    
    select p.dni as 'DNI',b.barrio as 'BARRIO',t.numero_de_casa as 'NUMERO DE CASA', ma.fecha as 'FECHAA', md.fecha as 'FECHAB', 
    (DATEDIFF(day, md.fecha,ma.fecha) as 'DIAS ENTRE MEDICIONES',(md.litros - ma.litros) as 'LITROS CONSUMIDOS' from mediciones as md
    inner join tomas as t on t.id = md.id_toma
    inner join propietarios as p on p.dni = t.dni_propietario
    inner join barrios as b on b.id = t.id_barrio
    inner join tomas as ma on month(ma.fecha) = month(DATEADD(month,-1,md.fecha)) and year(ma.fecha) = year(DATEADD(month,-1,md.fecha))
     where year(md.fecha) = @año;

    no crea ninguna tabla temporal, pero creo que te va a devolver los datos que tu quieres cada vez que ejecutas la consulta, la condición que he puesto para mostrar, es que la fecha este dentro del año que elijas, puedes añadir condiciones al where para filtrarlo más

    no tengo una db con la que probar la consulta, así que no se si puede haber fallos...

    nos comentas que tal te va

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 2 de octubre de 2017 10:22
  • vale, he probado en SQL Server, y me da esto

    DECLARE @año integer = 2017;  
    
    SELECT p.dni AS 'DNI',b.barrio AS 'BARRIO',t.[numero de casa] AS 'NUMERO DE CASA', ma.fecha AS 'FECHAA', md.fecha AS 'FECHAB', 
    (DATEDIFF(day, ma.fecha,md.fecha)) AS 'DIAS ENTRE MEDICIONES',(md.litros - ma.litros) AS 'LITROS CONSUMIDOS' from [consulta].[dbo].[mediciones] md
    inner join [consulta].[dbo].[tomas]  t on t.id = md.id_toma
    inner join [consulta].[dbo].[propietarios]  p on p.dni = t.dni_propietario
    inner join [consulta].[dbo].[barrios]  b on b.id = t.id_barrio
    inner join [consulta].[dbo].[mediciones]  ma on month(ma.fecha) = month(DATEADD(month,-1,md.fecha)) and year(ma.fecha) = year(DATEADD(month,-1,md.fecha))
     where year(md.fecha) = @año;

    mi base de datos se llama [consulta], tendras que cambiarlo donde lo veas, y adaptar la query a tus tablas, pero el resultado que me devuelve es este:


    pruebala a ver que te parece

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 2 de octubre de 2017 13:36
  • Buenas,

    Como es el formato de tu tabla inicial?

    me refiero, el formato de tu tabla temporal tiene bastante logica, quizas, debieras cambiar el formato de tu tabla principal para no necesitar una tabla temporal. luego, cuando quieras saber los acumulados, simplemente necesitas obtener la suma de ellos. Es mejor ir acumulando incrementos y calcular el total en la consulta, que tener que ir desglosando en una tabla temporal. te va a simplificar bastante el tema.

    Esto es posible?

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 2 de octubre de 2017 9:53

Todas las respuestas

  • http : // i68 . tinypic  . com / 14tr295  . jpg

    no me deja subir imagenes todavia

    sábado, 30 de septiembre de 2017 14:39
  • nadie?
    domingo, 1 de octubre de 2017 23:13
  • Buenas,

    Como es el formato de tu tabla inicial?

    me refiero, el formato de tu tabla temporal tiene bastante logica, quizas, debieras cambiar el formato de tu tabla principal para no necesitar una tabla temporal. luego, cuando quieras saber los acumulados, simplemente necesitas obtener la suma de ellos. Es mejor ir acumulando incrementos y calcular el total en la consulta, que tener que ir desglosando en una tabla temporal. te va a simplificar bastante el tema.

    Esto es posible?

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 2 de octubre de 2017 9:53
  • Buenas,

    No había visto la imagen,

    no soy experto en SQL Server, asi que puede que esrta consulta tenga mil errores, pero puedes probar a ver que tal te va:

    DECLARE @año integer = 2017;  
    
    select p.dni as 'DNI',b.barrio as 'BARRIO',t.numero_de_casa as 'NUMERO DE CASA', ma.fecha as 'FECHAA', md.fecha as 'FECHAB', 
    (DATEDIFF(day, md.fecha,ma.fecha) as 'DIAS ENTRE MEDICIONES',(md.litros - ma.litros) as 'LITROS CONSUMIDOS' from mediciones as md
    inner join tomas as t on t.id = md.id_toma
    inner join propietarios as p on p.dni = t.dni_propietario
    inner join barrios as b on b.id = t.id_barrio
    inner join tomas as ma on month(ma.fecha) = month(DATEADD(month,-1,md.fecha)) and year(ma.fecha) = year(DATEADD(month,-1,md.fecha))
     where year(md.fecha) = @año;

    no crea ninguna tabla temporal, pero creo que te va a devolver los datos que tu quieres cada vez que ejecutas la consulta, la condición que he puesto para mostrar, es que la fecha este dentro del año que elijas, puedes añadir condiciones al where para filtrarlo más

    no tengo una db con la que probar la consulta, así que no se si puede haber fallos...

    nos comentas que tal te va

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 2 de octubre de 2017 10:22
  • Hola Jorge. Gracias por la respuesta.

    La consulta me da error: 

    "instruccion sql no valida; se esperaba 'delete','inserte','procedure','select' o 'update'."

    Por si lo hace mas fácil. esta es la consulta que tengo creada:

    SELECT Propietarios.dni, barrio.barrio, tomas.[numero de casa], mediciones.fecha, mediciones.litros
    FROM (Propietarios INNER JOIN (barrio INNER JOIN tomas ON barrio.Id = tomas.id_barrio) ON Propietarios.dni = tomas.dni_propietario) INNER JOIN mediciones ON tomas.Id = mediciones.Id_toma
    GROUP BY Propietarios.dni, barrio.barrio, tomas.[numero de casa], mediciones.fecha, mediciones.litros;

    esta muestra:

    DNI(identifica propietario)

    Barrio,Numero(identifica la toma) 

    fecha,litros(medidas tomadas del contador)


    La idea es que de cada toma reste le reste la medicion anterior para tener los litros reales y reste las fechas para saber el numero de dias. En otro lenguaje no me seria dificil hacerlo, datos para el array, un bucle que lo recorra y reste y solucionado pero en sql se me resiste.

    espero que me podais ayudar. gracias

     

    lunes, 2 de octubre de 2017 12:31
  • Voy a intentar crear una db según tu esquema para probarlo, es SQL Server? 

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 2 de octubre de 2017 12:35
  • vale, he probado en SQL Server, y me da esto

    DECLARE @año integer = 2017;  
    
    SELECT p.dni AS 'DNI',b.barrio AS 'BARRIO',t.[numero de casa] AS 'NUMERO DE CASA', ma.fecha AS 'FECHAA', md.fecha AS 'FECHAB', 
    (DATEDIFF(day, ma.fecha,md.fecha)) AS 'DIAS ENTRE MEDICIONES',(md.litros - ma.litros) AS 'LITROS CONSUMIDOS' from [consulta].[dbo].[mediciones] md
    inner join [consulta].[dbo].[tomas]  t on t.id = md.id_toma
    inner join [consulta].[dbo].[propietarios]  p on p.dni = t.dni_propietario
    inner join [consulta].[dbo].[barrios]  b on b.id = t.id_barrio
    inner join [consulta].[dbo].[mediciones]  ma on month(ma.fecha) = month(DATEADD(month,-1,md.fecha)) and year(ma.fecha) = year(DATEADD(month,-1,md.fecha))
     where year(md.fecha) = @año;

    mi base de datos se llama [consulta], tendras que cambiarlo donde lo veas, y adaptar la query a tus tablas, pero el resultado que me devuelve es este:


    pruebala a ver que te parece

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    lunes, 2 de octubre de 2017 13:36
  • Muchas gracias, parece lo que buscaba. En realidad era en access pero en los foros de access nadie sabia, debería de poder adaptarlo sin problemas de server a access.

    Gracias

     
    jueves, 5 de octubre de 2017 1:13
  • Sin ningún problema,  debería ser fácil adaptarlo. 

    Nos comentas que tal va. 

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    jueves, 5 de octubre de 2017 6:03