Ir al contenido


Foto

consulta multiple


  • Por favor identifícate para responder
11 respuestas en este tema

#1 marthamelo

marthamelo

    Advanced Member

  • Miembros
  • PipPipPip
  • 106 mensajes
  • LocationA Coruña

Escrito 17 febrero 2012 - 06:16

Hola continuando con mis consultas he llegado a una que no logro terminar les explico a ver si me podéis ayudar gracias
Nuestra empresa tiene un parque de maquinarias y deseo saber cuantas maquinas trabajan diariamente en nuestras obras ejemplo:
Tenemos  20 palas, 50 camiones, 10 retros, 2 buldocers,  5 damper, etc. y deseo que la consulta me devuelva  la cantidad de cada uno que trabajo diario sabiendo que estos datos entran mediante los partes de trabajo diario que contiene la fecha, operario, maquina, horas, obras etc. He logrado hacer la consulta para uno
SELECT  FECHA_PARTE, COUNT(MAQUINA) AS PALAS 
FROM PARTES WHERE MAQUINA LIKE('PA%') AND FECHA_PARTE BETWEEN ('01/01/2012') AND ('31/01/2012')
GROUP BY FECHA_PARTE

pero no se como hacer para obtenerlos todos intente con unión pero me da error
Las maquinas las registramos por las 2 primeras letras y su numero

  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 17 febrero 2012 - 06:24

Hola
SELECT  DISTINCT  MAQUINA,  FECHA_PARTE,  COUNT(MAQUINA) AS PALAS 

FROM PARTES WHERE  FECHA_PARTE BETWEEN ('01/01/2012') AND ('31/01/2012')

GROUP BY MAQUINA, FECHA_PARTE

Bueno, das pocos datos, no esperes mucho  :D
Saludos
  • 0

#3 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 18 febrero 2012 - 03:55

Escribe un par de ejemplos de los datos qie contiene tu base de datos y otro de como te gustaria que quedara y asi podemos ayudarte mejor

  • 0

#4 marthamelo

marthamelo

    Advanced Member

  • Miembros
  • PipPipPip
  • 106 mensajes
  • LocationA Coruña

Escrito 18 febrero 2012 - 08:47

Hola luk2009 mi tabla de partes a la cual consulto  contiene los siguientes datos
[table]
[tr]
[td]Nºparte        fecha        operario maquina   obra  horasT  horasP totalH[table][tr][td]
[table][tr][td]20120132 02/01/2012       453        PA010 654300   8           0           8[table][tr][td]
[table][tr][td]20120132  02/01/2012       654        BL010      654300      7         1           8[/td]
[/tr]
[/table]

La respuesta que quisiera obtener de mi consulta seria algo así
[table]
[tr]
[td]  fecha      Palas   Buldocer   Camiones   Total[/td][/tr]
[tr][td]02/01/2012    4         3         10               17[/td][/tr]
[tr][td]03/01/2012     2         1           7               10[/td][/tr]
[/table]

Es dividir en columnas las maquinarias utilizadas por día sumando todas  las obras en un periodo de tiempo
[/td][/tr][/table][/td][/tr][/table][/td][/tr][/table][/td][/tr][/table]
  • 0

#5 jdepaz

jdepaz

    Advanced Member

  • Miembros
  • PipPipPip
  • 264 mensajes
  • LocationMedellín Colombia

Escrito 18 febrero 2012 - 07:27

Hola buen día,

La consulta que deseas realizar es del tipo Cross-Tab,

Para lo cual podrías consultar la ayuda del MSDN,
y realizar la consulta según tus especificaciones.

http://msdn.microsof...(v=sql.90).aspx


Saludos
  • 0

#6 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 18 febrero 2012 - 08:23

Hola buen día,

La consulta que deseas realizar es del tipo Cross-Tab,


Es correcto lo que menciona jdepaz, tuve un día un caso de estos que me hiciste recordar y por tanto espero esto te ayude:

Solución:

Select Fecha, [PA] As Palas, [BL] As Buldocer, [CA] As Camiones, [PA] + [BL] + [CA] As Total
From(
Select Fecha, Left(Maquina,2) As Maquina
From (
          Select Distinct Fecha, Maquina As Maquina FROM partes
        )As B
) As Resumen PIVOT (COUNT(Maquina) FOR Maquina IN ([PA],[BL],[CA])) As Pvt


Resultado:

Fecha     Palas  Buldocer  Camiones Total
2012-01-02 2       0       0       2
2012-01-03 1       2       0       3



Te explico, espero darme a entender:

Este Select nos asegura que solo consideraremos una máquina para el día, así si existen más registros para una misma máquina en el mismo día, solo la tomaremos en cuenta 1 vez.

Select Distinct Fecha, Maquina As Maquina FROM partes


Ahora, la siguiente parte: dado que las maquinas las registramos por las 2 primeras letras y su numero, entonces:

Select Fecha, Left(Maquina,2) As Maquina
From (
      Select Distinct Fecha, Maquina As Maquina FROM partes
    )As B


El resultado sería, hasta aquí:

Fecha     Maquina
2012-01-02 PA
2012-01-02 PA
2012-01-03 BL
2012-01-03 BL
2012-01-03 PA


Pero como requieres los resultados en modo Cross-Tab, requiere algo extra:

  As Resumen PIVOT (COUNT(Maquina) FOR Maquina IN ([PA],[BL],[CA])) As Pvt

Nota que especificamos un conteo por máquina que ya previamente hemos agrupado por fecha en el query anterior, además notaras que he colocado: [PA],[BL],[CA], estas son las inciales de las máquinas, si lo cambios notarás que ya no las contará correctamente.

Existe una desventaja aún en este modelo, dado que si ingresas un equipo cuyas iniciales no esten en: [PA],[BL],[CA], no te las mostrará.

Espero te ayude esto, cualquier cosa no dudes en comentar.

Saludos
  • 0

#7 marthamelo

marthamelo

    Advanced Member

  • Miembros
  • PipPipPip
  • 106 mensajes
  • LocationA Coruña

Escrito 20 febrero 2012 - 05:33

Hola  funciona  perfecto  GRCIAS  he aprendido  algo que nunca nos explicaron en sql gracias miiiillll
  • 0

#8 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 20 febrero 2012 - 08:00

:D Lo mismo me dije, aquella vez que tuve q investigar sobre como hacer una consulta similar.

Saludos
  • 0

#9 marthamelo

marthamelo

    Advanced Member

  • Miembros
  • PipPipPip
  • 106 mensajes
  • LocationA Coruña

Escrito 20 febrero 2012 - 11:25

Hola fredycc,  perdona  pero necesito también agregar el total de  las horas  trabajadas por día he estado probando pero no me funciona a ver si puedes ayudarme también en eso gracias  seria agregar una consulta así 

select fecha, sum(horasT) as horas_Trb, sum(horasP) as horas_par, sum(totalH) as horas_totales
from partes
group by fecha

quedaria algo así
  fecha        Palas    Buldocer      Camiones    Total  horaT  horasP    totalH
02/01/2012      4            3            10                  17        136        0        136
03/01/2012        2            1              7                  10          76        4          80
  • 0

#10 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 20 febrero 2012 - 01:37

Mmm, para no complicarlo con una consulta que modifique mucho la anterior, se me ocurre algo así, dado que la Fecha sigue siendo el factor entre ambos problemas.


Select Maquinas.Fecha, Palas, Buldocer, Camiones, Maquinas.Total, HoraT, HoraP, HoraT + HoraP As TotalH
from
(
Select Fecha, [PA] As Palas, [BL] As Buldocer, [CA] As Camiones, [PA] + [BL] + [CA] As Total
From(
  Select Fecha, Left(Maquina,2) As Maquina
  From (
Select Distinct Fecha, Maquina As Maquina FROM partes
  )As B
  ) As Resumen PIVOT (COUNT(Maquina) FOR Maquina IN ([PA],[BL],[CA])) As Pvt
)As Maquinas

INNER JOIN

(
Select Fecha, SUM(HorasT) As HoraT, SUM(HorasP) As HoraP
From partes
Group By Fecha
)As Horas on Horas.Fecha = Maquinas.Fecha


Como verás he agregado una consulta más abajo del Query anterior, solamente:

    Select Fecha, SUM(HorasT) As HoraT, SUM(HorasP) As HoraP
From partes
Group By Fecha


nota que la fecha es el criterio de JOIN que une a los querys:

)As Horas on Horas.Fecha = Maquinas.Fecha


Esto nos permite conservar sin modificaciones lo anterior y creo solucionando el problema que planteas, a menos que indiques los contrario, nota también que en select emergente nos traemos los campos que nos interesan solamente.

Para el campo TotalH, aquí he sumado los 2 anteriores para obtener este dato, pero si lo almacenas como creo lo haces, puedes sumarlo como los anteriores y traerlo en el select emergente.

Resultado:

Fecha         Palas Buldocer   Camiones Total HoraT HoraP   TotalH
2012-01-02       2       0       0       2       8   14       22
2012-01-03       1       2       0       3       8      7       15


Espero te ayude esto.

Saludos
  • 0

#11 chaja

chaja

    Advanced Member

  • Miembros
  • PipPipPip
  • 54 mensajes

Escrito 06 marzo 2012 - 03:12

^o|
hola.... hay algo que me perdi... esto es para que motor? interbase anda?????


Luis Roldan
  • 0

#12 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 06 marzo 2012 - 04:23

Solo es para MS SQL Server, para interbase o firebird creo se podría usar un For Select para acomodar los datos, si te interesa nos ponemos a investigar más al respecto.

Solo que en la sección de interbae/firebird para ubicar el tema

Saludos
  • 0




IP.Board spam blocked by CleanTalk.