Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Unificar campos

Estas en el tema de Unificar campos en el foro de SQL Server en Foros del Web. Buenas tardes, espero que alguien me pueda ayudar con el problema que tengo, ya que no estoy muy puesto en sql, tengo la siguiente consulta ...
  #1 (permalink)  
Antiguo 06/12/2013, 14:37
 
Fecha de Ingreso: diciembre-2013
Mensajes: 4
Antigüedad: 10 años, 4 meses
Puntos: 0
Unificar campos

Buenas tardes, espero que alguien me pueda ayudar con el problema que tengo, ya que no estoy muy puesto en sql, tengo la siguiente consulta realizada:

Código SQL:
Ver original
  1. SELECT
  2. DateName(m,PartesDiarios.FechaInicial) Mes, LEFT(CONVERT(VARCHAR,(Partes_Diarios_Conduccion.HoraFinalConduccion)-(Partes_Diarios_Conduccion.HoraInicioConduccion),108),5) Horas,
  3. Partes_Diarios_Conduccion.Conductor1 Conductor1, Partes_Diarios_Conduccion.Conductor2 Conductor2
  4. FROM
  5. PartesDiarios PartesDiarios
  6. LEFT JOIN PartesDiariosConduccion Partes_Diarios_Conduccion ON ( PartesDiarios.AnoRegistro=Partes_Diarios_Conduccion.AnoRegistroPartes AND PartesDiarios.NRegistro=Partes_Diarios_Conduccion.NRegistroPartes )
  7. WHERE
  8. ( (UPPER(Partes_Diarios_Conduccion.Seccion) LIKE 'vegetales%') )
  9. ORDER BY
  10. MONTH(PartesDiarios.FechaInicial) ASC, Partes_Diarios_Conduccion.Conductor1 ASC
Consulta que me saca la siguiente tabla:

Mes Horas Conductor1 Conductor2
Enero 2:00 1 2
Enero 0:40 3 4
Enero 2:00 3 5
Enero 1:00 6 2
Enero 0:54 6 5
Febrero 1:15 6 2
Febrero 1:00 6 7
Febrero 1:00 6 7
Febrero 1:00 6 7
Febrero 1:00 6 7
Febrero 0:30 6 2
Febrero 0:30 6 5
Marzo 1:00 6 2
Marzo 1:00 5 6
Marzo 1:00 5 8
Marzo 1:05 5 8
Marzo 1:00 5 8
Marzo 1:10 5 8
........

Lo que quisiera poder sacar en la consulta, son estos mismo datos, pero que me salga sólo una columna de conductor y la columna de hora sume el tiempo que está como conductor 1 y 2 y al mes, es decir, algo como esto:

Mes Horas Conductor
Enero 2:00 1
Enero 3:00 2
Enero 2:40 3
Enero 0:40 4
Enero 2:54 5
Enero 1:54 6
Febrero ........

No se si me he explicado bien, un saludo y gracias.

Última edición por gnzsoloyo; 06/12/2013 a las 14:45
  #2 (permalink)  
Antiguo 06/12/2013, 14:47
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Unificar campos

lo primero seria acomodar la consulta para poder hacer la agrupacion o sumatoria de los datos pudiendo quedar algo como esto:

Código SQL:
Ver original
  1. SELECT
  2. DateName(m,PartesDiarios.FechaInicial) Mes, LEFT(CONVERT(VARCHAR,(Partes_Diarios_Conduccion.Ho raFinalConduccion)-(Partes_Diarios_Conduccion.HoraInicioConduccion),1 08),5) Horas,
  3. Partes_Diarios_Conduccion.Conductor1 Conductor1
  4. FROM
  5. PartesDiarios PartesDiarios
  6. LEFT JOIN PartesDiariosConduccion Partes_Diarios_Conduccion ON ( PartesDiarios.AnoRegistro=Partes_Diarios_Conduccio n.AnoRegistroPartes AND PartesDiarios.NRegistro=Partes_Diarios_Conduccion. NRegistroPartes )
  7. WHERE
  8. ( (UPPER(Partes_Diarios_Conduccion.Seccion) LIKE 'vegetales%') )
  9. UNION ALL
  10. SELECT
  11. DateName(m,PartesDiarios.FechaInicial) Mes, LEFT(CONVERT(VARCHAR,(Partes_Diarios_Conduccion.Ho raFinalConduccion)-(Partes_Diarios_Conduccion.HoraInicioConduccion),1 08),5) Horas,
  12. Partes_Diarios_Conduccion.Conductor2 Conductor2
  13. FROM
  14. PartesDiarios PartesDiarios
  15. LEFT JOIN PartesDiariosConduccion Partes_Diarios_Conduccion ON ( PartesDiarios.AnoRegistro=Partes_Diarios_Conduccio n.AnoRegistroPartes AND PartesDiarios.NRegistro=Partes_Diarios_Conduccion. NRegistroPartes )
  16. WHERE
  17. ( (UPPER(Partes_Diarios_Conduccion.Seccion) LIKE 'vegetales%') )

con esto obtenemos los datos de la siguiente forma:

Enero 2:00 1
Enero 2:00 2
Enero 0:40 3
Enero 0:40 4
Enero 2:00 3
Enero 2:00 5
Enero 1:00 6
Enero 1:00 2

Ahora con esos resultados podemos hacer lo siguiente

Código SQL:
Ver original
  1. SELECT SUM(horas), mes,conductor FROM tabla GROUP BY mes,conductor

y con eso obtenemos el resultado que buscas :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 07/12/2013, 14:17
 
Fecha de Ingreso: diciembre-2013
Mensajes: 4
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Unificar campos

Gracias Libras, me ha servido la primera parte, pero la segunda no la he podido implementar, ya que la aplicación se basa en sql pero sólo puedo hacer una consulta, es decir no puedo realizar una consulta de otra consulta realizada, y si lo pongo seguido sólo coge la primera, la otra es como si no existiera.

Nuevamente muchas Gracias.
  #4 (permalink)  
Antiguo 09/12/2013, 08:39
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Unificar campos

si solo ocupas una consulta puedes hacer esto:

Código SQL:
Ver original
  1. SELECT SUM(horas), mes, conductor FROM
  2. (
  3. SELECT
  4. DateName(m,PartesDiarios.FechaInicial) Mes, LEFT(CONVERT(VARCHAR,(Partes_Diarios_Conduccion.Ho raFinalConduccion)-(Partes_Diarios_Conduccion.HoraInicioConduccion),1 08),5) Horas,
  5. Partes_Diarios_Conduccion.Conductor1 Conductor1
  6. FROM
  7. PartesDiarios PartesDiarios
  8. LEFT JOIN PartesDiariosConduccion Partes_Diarios_Conduccion ON ( PartesDiarios.AnoRegistro=Partes_Diarios_Conduccio n.AnoRegistroPartes AND PartesDiarios.NRegistro=Partes_Diarios_Conduccion. NRegistroPartes )
  9. WHERE
  10. ( (UPPER(Partes_Diarios_Conduccion.Seccion) LIKE 'vegetales%') )
  11. UNION ALL
  12. SELECT
  13. DateName(m,PartesDiarios.FechaInicial) Mes, LEFT(CONVERT(VARCHAR,(Partes_Diarios_Conduccion.Ho raFinalConduccion)-(Partes_Diarios_Conduccion.HoraInicioConduccion),1 08),5) Horas,
  14. Partes_Diarios_Conduccion.Conductor2 Conductor2
  15. FROM
  16. PartesDiarios PartesDiarios
  17. LEFT JOIN PartesDiariosConduccion Partes_Diarios_Conduccion ON ( PartesDiarios.AnoRegistro=Partes_Diarios_Conduccio n.AnoRegistroPartes AND PartesDiarios.NRegistro=Partes_Diarios_Conduccion. NRegistroPartes )
  18. WHERE
  19. ( (UPPER(Partes_Diarios_Conduccion.Seccion) LIKE 'vegetales%') )
  20. ) completa GROUP BY conductor,mes

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 14/12/2013, 10:26
 
Fecha de Ingreso: diciembre-2013
Mensajes: 4
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Unificar campos

Gracias por tu interes, Libras.

He probado lo que me has indicado pero me sale un error con la última parte, me indica que la columna conductor no existe, se refiere a "completa GROUP BY conductor,mes"

Un saludo
  #6 (permalink)  
Antiguo 14/12/2013, 12:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Unificar campos

Cita:
Iniciado por lofcs Ver Mensaje
Gracias por tu interes, Libras.

He probado lo que me has indicado pero me sale un error con la última parte, me indica que la columna conductor no existe, se refiere a "completa GROUP BY conductor,mes"

Un saludo
Pues es simple: En la consulta exterior, ese campo no existe.
Si te fijas bien, si te tomas la molestia de ordenar la consulta verás que el campo devuelto por la subconsulta no se llama así:
Código SQL:
Ver original
  1. SELECT SUM(horas), mes, conductor
  2. FROM
  3.     (SELECT
  4.         DateName(m,PartesDiarios.FechaInicial) Mes,
  5.         LEFT(CONVERT(VARCHAR,(Partes_Diarios_Conduccion.Ho raFinalConduccion)-(Partes_Diarios_Conduccion.HoraInicioConduccion),1 08),5) Horas,
  6.         Partes_Diarios_Conduccion.Conductor1 Conductor1
  7.     FROM    PartesDiarios PartesDiarios
  8.         LEFT JOIN PartesDiariosConduccion Partes_Diarios_Conduccion ON (PartesDiarios.AnoRegistro = Partes_Diarios_Conduccio n.AnoRegistroPartes AND PartesDiarios.NRegistro = Partes_Diarios_Conduccion. NRegistroPartes )
  9.     WHERE ((UPPER(Partes_Diarios_Conduccion.Seccion) LIKE 'vegetales%'))
  10.     UNION ALL
  11.     SELECT
  12.         DateName(m,PartesDiarios.FechaInicial) Mes,
  13.         LEFT(CONVERT(VARCHAR,(Partes_Diarios_Conduccion.Ho raFinalConduccion)-(Partes_Diarios_Conduccion.HoraInicioConduccion),1 08),5) Horas,
  14.         Partes_Diarios_Conduccion.Conductor2 Conductor2
  15.     FROM    PartesDiarios PartesDiarios
  16.         LEFT JOIN PartesDiariosConduccion Partes_Diarios_Conduccion ON (PartesDiarios.AnoRegistro = Partes_Diarios_Conduccion.AnoRegistroPartes AND PartesDiarios.NRegistro=Partes_Diarios_Conduccion.NRegistroPartes )
  17.     WHERE
  18.         ((UPPER(Partes_Diarios_Conduccion.Seccion) LIKE 'vegetales%'))) completa
  19. GROUP BY conductor,mes
El alias devuelto es "Conductor1 ".
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 07/01/2014, 01:43
 
Fecha de Ingreso: diciembre-2013
Mensajes: 4
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Unificar campos

Nada la primera parte si me funciona pero la otra que es que sume el tiempo por conductor, me da fallos, me estoy ya volviendo loco
  #8 (permalink)  
Antiguo 07/01/2014, 04:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Unificar campos

Postea los fallos. No somos adivinos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: campos, fecha, registro, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:43.