Visual Basic - PROBLEMAS CON SELECT Y SUM1() Y SUM2()

Life is soft - evento anual de software empresarial
 
Vista:

PROBLEMAS CON SELECT Y SUM1() Y SUM2()

Publicado por genosol (8 intervenciones) el 07/09/2009 12:06:45
Buenos días.

Tengo dos tablas. Una de horas asignadas a proyectos y otra con facturas de proyectos.
tabla horas: idpersonal, idproyecto, horas
tabla facturas:idproyecto, totalfactura
quería mostrar en un data grid idpersonal, idproyecto, horas_totales (por proyecto), total_factura (por proyecto)

he intentado hacerlo de varias formas pero siempre me da disitntos errores:

sql = "SELECT HORAS.Idproyecto, sum(horas.horas) as HORAS_TOTALES, ISNULL(FACTURAS.SUM_TOTALES,0) AS TOTAL_FACTURAS FROM HORAS AS HORAS LEFT OUTER JOIN (SELECT sum(TOTALES) as SUM_TOTALES from FACTURAS GROUP BY idproyecto) as FACTURAS ON HORAS.IDPROYECTO=FACTURAS.IDPROYECTO GROUP BY HORAS.IDPROYECTO ORDER BY HORAS.IDPROYECTO"

También lo he intentado vinculándolas a una tabla más. aquí si me muestra registros, pero los muestra mal. Los totales de las facturas están cuadriplicados y, a veces, las horas están duplicadas:

sql = "SELECT horas.idpersonal as ID, horas.abreviado as PERSONAL, horas.idproyecto as Nº_PROYECTO, sum(horas.horas) as HORAS_TOTALES, sum(facturas.totales) as TOTAL_FACTURAS from horas INNER JOIN (PROYECTO INNER JOIN FACTURAS ON proyecto.idproyecto=facturas.idproyecto) ON horas.idproyecto=proyecto.idproyecto group by horas.idpersonal, horas.abreviado, horas.idproyecto order by horas.idproyecto"

Me pueden ayudar?

un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:PROBLEMAS CON SELECT Y SUM1() Y SUM2()

Publicado por pacopaz (173 intervenciones) el 07/09/2009 17:09:06
Este problema es más de sql que de vb.
No explicas que base de datos usas, pero el query que utilizas tiene un problema fundamental al estar haciendo la unión. La solución es hacer dos dos queries y luego unirlos através de idproyecto. Sin embargo, si quisieras tener el id de cada persona, entonces tendrías que hacer hasta tres subconsultas, una para tarer los id's, otra para las horas totales (de todas las personas) y una tercera para el total facturado, aunque para cada persona se tendría la misma información, para cada proyecto.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PROBLEMAS CON SELECT Y SUM1() Y SUM2()

Publicado por genosol (8 intervenciones) el 07/09/2009 18:45:19
Hola Paco, perdona por no enviarlo completo

'BdD ACCESS

Set rsres = New ADODB.Recordset
rsres.CursorLocation = adUseClient
sql = LOS SELECT QUE ENVIÉ
rsres.Open sql, con, adOpenStatic, adLockReadOnly, adCmdText
Set DGresumen.DataSource = rsres

Necesito mostrar para cada idpersonal, las horas empleadas en cada proyecto, y el total facturado por proyecto.
me quedarias las columnas de la siguiente forma:
idpersonal, nombrepersonal, idproyecto, horas_totales (sum de la tabla horas) y total_factura (sum de la tabla factura).

Uniendo los queries por idproyecto me da error ya que tas tablas son diferentes, no presentan el mismo número de registos.

Mediante idpersonal no podría hacerlo ya que las tablas facturas y proyectos no presenta el campo idpersonal. Tendría que crearlo.......

No sé si me he explicado bien.

Un saludo y gracias por contestar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PROBLEMAS CON SELECT Y SUM1() Y SUM2()

Publicado por pacopaz (173 intervenciones) el 07/09/2009 19:14:03
Y lo entendí desde el principio, mi estimado. Es justo por eso que te digo que necesitarías subqueries. Lo que creo que no alcanzas a ubicar son los subqueries. Es algo como esto (aunque no necesariamente esto):

select p.idpersonal, p.idproyecto, p.horas, r.total
from
(select idpersonal, idproyecto, sum(horas) as horas
from horas group by idpersonal, idproyecto) as p
inner join
(select idproyecto, sum(totalfactura) as total
from facturas group by idproyecto) as r
on p.idproyecto = r.idproyecto

Espero que ahora se entienda el query y los subqueries que contiene.

Saludos.

Francisco Paz
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PROBLEMAS CON SELECT Y SUM1() Y SUM2()

Publicado por genosol (1 intervención) el 07/09/2009 19:48:59
Hola Francisco,
Gracias de nuevo por contestar. No dudo que me entiendas, pero como no tengo mucha experiencia, igual no me explico bien.
También he hecho estas consultas:

'estos me han dado muchos errores -2147217887 de agregados, etc.... y errores de sintaxis
sql = "SELECT HORAS.Idproyecto, sum(horas.horas) as HORAS_TOTALES, ISNULL(FACTURAS.SUM_TOTALES,0) AS TOTAL_FACTURAS FROM HORAS AS HORAS LEFT OUTER JOIN (SELECT sum(TOTALES) as SUM_TOTALES from FACTURAS GROUP BY idproyecto) as FACTURAS ON HORAS.IDPROYECTO=FACTURAS.IDPROYECTO GROUP BY HORAS.IDPROYECTO ORDER BY HORAS.IDPROYECTO"

'sql = "SELECT horas.idpersonal as ID, horas.abreviado as PERSONAL, horas.idproyecto as Nº_PROYECTO, sum(horas.horas) as HORAS_TOTALES, facturas.totales as TOTAL_FACTURA from horas INNER JOIN (PROYECTO INNER JOIN (Select sum(totales) as totales from FACTURAS group by facturas.idproyecto) as facturas ON proyecto.idproyecto=facturas.idproyecto) ON Horas.idproyecto=proyecto.idproyecto group by horas.idpersonal, horas.abreviado, horas.idproyecto order by horas.idproyecto"

esta no da error pero no suma bien...
'sql = "SELECT horas.idpersonal as ID, horas.abreviado as PERSONAL, horas.idproyecto as Nº_PROYECTO, sum(horas.horas) as HORAS_TOTALES, sum(facturas.totales) as TOTAL_FACTURAS from horas INNER JOIN FACTURAS ON facturas.idproyecto=horas.idproyecto group by horas.idpersonal, horas.abreviado, horas.idproyecto order by horas.idproyecto"

'número incorrecto de argumentos
sql = "SELECT HORAS.IDPROYECTO, ISNULL(FACTURAS.SUM_TOTALES,0) AS TOTAL_FACTURA FROM HORAS left JOIN (SELECT SUM(TOTALES) AS SUM_TOTALES FROM FACTURAS GROUP BY IDPROYECTO) AS FACTURAS ON HORAS.IDPROYECTO=FACTURAS.IDPROYECTo"

La solución que me enviaste también me da error de sintaxis.

no sé... no encuentro la solución

Gracias de nuevo
Geni
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

no se han especificado valores para algunos parame

Publicado por genosol (8 intervenciones) el 07/09/2009 20:06:08
Hola de nuevo Francisco,

Corregí el error en la cláusula from y me da el siguiente error (que me da en otros select):

"no se han especificado valores para algunos parámetros requeridos"

cómo puedo solucionarlo? Le ha dado un montón de vueltas....

Gracias otra vez
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:PROBLEMAS CON SELECT Y SUM1() Y SUM2()

Publicado por jaime guerrero (361 intervenciones) el 08/09/2009 21:20:04
en tu primer select estas cometiendo un monton de errores. te recomiendo que te inscribas a un curso de transact sql

prueba con lo siguiente

SELECT HORAS.Idproyecto, sum(horas.horas) as HORAS_TOTALES, ISNULL((SELECT sum(f.TOTALES) as SUM_TOTALES from FACTURAS as f
where f.idproyecto=HORAS.IDPROYECTO GROUP BY f.idproyecto)
,0) AS TOTAL_FACTURAS
FROM HORAS
GROUP BY HORAS.IDPROYECTO
ORDER BY HORAS.IDPROYECTO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

error Nº incorrecto de argumentos con la función

Publicado por Genosol (8 intervenciones) el 09/09/2009 08:58:36
Hola Jaime,

Gracias por contestar. Lo cierto es que tengo muy poco experiencia. Seguiré tu consejo y me apuntaré a un curso.

Probé lo que me enviaste y me da error "nº incorrecto de argumentos con la función en la expresión ((SELECT sum(f.TOTALES) as SUM_TOTALES from FACTURAS as f
where f.idproyecto=HORAS.IDPROYECTO GROUP BY f.idproyecto)
,0) as TOTAL_FACTURA)

Estoy un poco desesperadilla....... te importa ayudarme? tengo que solucionar esto y seguir...

un saludo,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Muchas gracias Jaime!!

Publicado por genosol (8 intervenciones) el 09/09/2009 13:33:15
Hola Jaime,

He quitado ISNULL y funciona perfectamente. Le he incluido horas.idpersonal y horas.abreviado.

sql = "SELECT HORAS. idpersonal, HORAS.abreviado, HORAS.Idproyecto as ID_PROYECTO, sum(horas.horas) as HORAS_TOTALES, (SELECT sum(f.TOTALES) as SUM_TOTALES from FACTURAS as f where f.idproyecto=HORAS.IDPROYECTO GROUP BY f.idproyecto) AS TOTAL_FACTURAS From HORAS GROUP BY HORAS.IDPERSONAL, HORAS.ABREVIADO, HORAS.IDPROYECTO ORDER BY HORAS.IDPROYECTO"

Un millón!!

geni,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar