Consulta Totales

02/12/2007 - 21:19 por Akhenaton | Informe spam
Hola.
se me ha plantedo la siguiente consulta y no se como solucionarla.

SELECT Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
MIN(Contratos.FInicio) AS Inicio,
MAX(Contratos.FInicio) AS Fin, SUM(Contratos.Importe)
AS Importe, YEAR(Contratos.FInicio) AS Año
FROM Contratos INNER JOIN
Proveedor ON Contratos.Proveedor = Proveedor.Proveedor
GROUP BY Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
YEAR(Contratos.FInicio)
ORDER BY Proveedor.Proveedor

Esta devuelve los datos correctos, la suma de los importes agrupados por
año, contrato.
y ahora quisiera añadirle los importe ya pagados si los hay tambien
agrupados por años, contrato
la tabla contratos tiene un campo Factura que indica si se ha pagado el
importe correspondiente, por lo que la consulta quedaria como:

SELECT SUM(Importe) AS Pendiente
FROM Contratos
WHERE (Factura = '' OR Factura IS NULL)
GROUP BY Contrato, YEAR(FInicio)

he intentado sin exito.
SELECT Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
MIN(Contratos.FInicio) AS Inicio,
MAX(Contratos.FInicio) AS Fin, SUM(Contratos.Importe)
AS Importe, YEAR(Contratos.FInicio) AS Año,
(SELECT SUM(Importe) AS Exp1
FROM Contratos
WHERE (Factura = '' OR Factura IS NULL)
GROUP BY Contrato, YEAR(FInicio)) AS Pendiente
FROM Contratos INNER JOIN Proveedor ON Contratos.Proveedor =
Proveedor.Proveedor
GROUP BY Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
YEAR(Contratos.FInicio)
ORDER BY Proveedor.Proveedor

alguna solucion para que una sola consulta devuelva los datos correctos.

Preguntas similare

Leer las respuestas

#1 Maxi
03/12/2007 - 14:31 | Informe spam
Hola, nos ayuda a ayudarlo? cual es la estructura de las tablas? podria
poner algunos datos de ejemplo? podria poner los resultados esperados?


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Akhenaton" escribió en el mensaje
news:
Hola.
se me ha plantedo la siguiente consulta y no se como solucionarla.

SELECT Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
MIN(Contratos.FInicio) AS Inicio,
MAX(Contratos.FInicio) AS Fin, SUM(Contratos.Importe)
AS Importe, YEAR(Contratos.FInicio) AS Año
FROM Contratos INNER JOIN
Proveedor ON Contratos.Proveedor = Proveedor.Proveedor
GROUP BY Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
YEAR(Contratos.FInicio)
ORDER BY Proveedor.Proveedor

Esta devuelve los datos correctos, la suma de los importes agrupados por
año, contrato.
y ahora quisiera añadirle los importe ya pagados si los hay tambien
agrupados por años, contrato
la tabla contratos tiene un campo Factura que indica si se ha pagado el
importe correspondiente, por lo que la consulta quedaria como:

SELECT SUM(Importe) AS Pendiente
FROM Contratos
WHERE (Factura = '' OR Factura IS NULL)
GROUP BY Contrato, YEAR(FInicio)

he intentado sin exito.
SELECT Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
MIN(Contratos.FInicio) AS Inicio,
MAX(Contratos.FInicio) AS Fin, SUM(Contratos.Importe)
AS Importe, YEAR(Contratos.FInicio) AS Año,
(SELECT SUM(Importe) AS Exp1
FROM Contratos
WHERE (Factura = '' OR Factura IS NULL)
GROUP BY Contrato, YEAR(FInicio)) AS Pendiente
FROM Contratos INNER JOIN Proveedor ON Contratos.Proveedor =
Proveedor.Proveedor
GROUP BY Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
YEAR(Contratos.FInicio)
ORDER BY Proveedor.Proveedor

alguna solucion para que una sola consulta devuelva los datos correctos.



Respuesta Responder a este mensaje
#2 Maxi Accotto
05/12/2007 - 01:12 | Informe spam
Hola, para esto podria usar tablas derivadas, algo asi como

select * from

(
SELECT Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
MIN(Contratos.FInicio) AS Inicio,
MAX(Contratos.FInicio) AS Fin, SUM(Contratos.Importe)
AS Importe, YEAR(Contratos.FInicio) AS Año
FROM Contratos INNER JOIN
Proveedor ON Contratos.Proveedor = Proveedor.Proveedor
GROUP BY Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
YEAR(Contratos.FInicio)
) t1

left join

(
SELECT SUM(Importe) AS Pendiente,contrato,YEAR(FInicio) as
año
FROM Contratos
WHERE (Factura = '' OR Factura IS NULL)
GROUP BY Contrato, YEAR(FInicio)
) t2
on
t1.contrato = t2.contrato and
t1.año = t2.año
ORDER BY t1.Proveedor



Microsoft MVP SQLServer
www.sqltotalconsulting.com
-

"Akhenaton" escribió en el mensaje de
noticias:#
Disculpen pero es posible que se haga un poco pesado el post

SELECT Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
MIN(Contratos.FInicio) AS Inicio,
MAX(Contratos.FInicio) AS Fin, SUM(Contratos.Importe)
AS Importe, YEAR(Contratos.FInicio) AS Año
FROM Contratos INNER JOIN
Proveedor ON Contratos.Proveedor = Proveedor.Proveedor
GROUP BY Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
YEAR(Contratos.FInicio)
ORDER BY Proveedor.Proveedor

Esta devuelve los datos correctos, la suma de los importes agrupados por
año, contrato.

Proveedor Nombre Contrato Inicio Fin Importe Año
23900 Manolo Regas 20467 01/03/2007 01/12/2007 6.509,97 ? 2007
23900 Manolo Regas 20467 01/02/2008 01/04/2008 2.705,71 ? 2008
23900 Manolo Regas 52600338 01/01/2007 01/12/2007 2.210,82 ? 2007
23900 Manolo Regas 52600365 01/01/2007 01/10/2007 6.047,99 ? 2007
23900 Manolo Regas 52600413 01/01/2007 01/12/2007 14.120,04 ? 2007
23900 Manolo Regas 52600414 01/01/2007 01/12/2007 4.500,00 ? 2007
23900 Manolo Regas 75130 01/01/2007 01/12/2007 9.633,48 ? 2007
23900 Manolo Regas S0526073 21/01/2007 01/12/2007 5.391,27 ? 2007
23900 Manolo Regas S076172A 01/01/2007 01/12/2007 7.957,27 ? 2007
23900 Manolo Regas SO526113 01/01/2007 01/12/2007 7.397,27 ? 2007
23900 Manolo Regas SO76136 21/01/2007 01/12/2007 21.429,74 ? 2007



y ahora quisiera añadirle los importe ya pagados si los hay tambien
agrupados por años, contrato
SELECT SUM(Importe) AS Pendiente
FROM Contratos
WHERE (Factura = '' OR Factura IS NULL)
GROUP BY Contrato, YEAR(FInicio)

Proveedor Contrato Año Pendiente
23900 20467 2007 5.411,42 ?
23900 20467 2008 2.705,71 ?
23900 52600338 2007 372,12 ?
23900 52600413 2007 2.353,34 ?
23900 52600414 2007 750,00 ?
23900 75130 2007 1.605,58 ?
23900 S0526073 2007 900,02 ?
23900 S076172A 2007 1.330,56 ?
23900 SO526113 2007 1.232,88 ?
23900 SO76136 2007 3.583,34 ?

Basicamente seria en la primera consulta añadir los importes pendiente de
la segunda consulta


Respuesta Responder a este mensaje
#3 Akhenaton
05/12/2007 - 20:50 | Informe spam
Perfecto. gracias por la ayuda. te debo una.


"Maxi Accotto" escribió en el mensaje
news:
Hola, para esto podria usar tablas derivadas, algo asi como

select * from

(
SELECT Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
MIN(Contratos.FInicio) AS Inicio,
MAX(Contratos.FInicio) AS Fin, SUM(Contratos.Importe)
AS Importe, YEAR(Contratos.FInicio) AS Año
FROM Contratos INNER JOIN
Proveedor ON Contratos.Proveedor = Proveedor.Proveedor
GROUP BY Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
YEAR(Contratos.FInicio)
) t1

left join

(
SELECT SUM(Importe) AS Pendiente,contrato,YEAR(FInicio) as
año
FROM Contratos
WHERE (Factura = '' OR Factura IS NULL)
GROUP BY Contrato, YEAR(FInicio)
) t2
on
t1.contrato = t2.contrato and
t1.año = t2.año
ORDER BY t1.Proveedor



Microsoft MVP SQLServer
www.sqltotalconsulting.com
-

"Akhenaton" escribió en el mensaje de
noticias:#
Disculpen pero es posible que se haga un poco pesado el post

SELECT Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
MIN(Contratos.FInicio) AS Inicio,
MAX(Contratos.FInicio) AS Fin,
SUM(Contratos.Importe)
AS Importe, YEAR(Contratos.FInicio) AS Año
FROM Contratos INNER JOIN
Proveedor ON Contratos.Proveedor =
Proveedor.Proveedor
GROUP BY Proveedor.Proveedor, Proveedor.Nombre, Contratos.Contrato,
YEAR(Contratos.FInicio)
ORDER BY Proveedor.Proveedor

Esta devuelve los datos correctos, la suma de los importes agrupados por
año, contrato.

Proveedor Nombre Contrato Inicio Fin Importe Año
23900 Manolo Regas 20467 01/03/2007 01/12/2007 6.509,97 ? 2007
23900 Manolo Regas 20467 01/02/2008 01/04/2008 2.705,71 ? 2008
23900 Manolo Regas 52600338 01/01/2007 01/12/2007 2.210,82 ? 2007
23900 Manolo Regas 52600365 01/01/2007 01/10/2007 6.047,99 ? 2007
23900 Manolo Regas 52600413 01/01/2007 01/12/2007 14.120,04 ? 2007
23900 Manolo Regas 52600414 01/01/2007 01/12/2007 4.500,00 ? 2007
23900 Manolo Regas 75130 01/01/2007 01/12/2007 9.633,48 ? 2007
23900 Manolo Regas S0526073 21/01/2007 01/12/2007 5.391,27 ? 2007
23900 Manolo Regas S076172A 01/01/2007 01/12/2007 7.957,27 ? 2007
23900 Manolo Regas SO526113 01/01/2007 01/12/2007 7.397,27 ? 2007
23900 Manolo Regas SO76136 21/01/2007 01/12/2007 21.429,74 ? 2007



y ahora quisiera añadirle los importe ya pagados si los hay tambien
agrupados por años, contrato
SELECT SUM(Importe) AS Pendiente
FROM Contratos
WHERE (Factura = '' OR Factura IS NULL)
GROUP BY Contrato, YEAR(FInicio)

Proveedor Contrato Año Pendiente
23900 20467 2007 5.411,42 ?
23900 20467 2008 2.705,71 ?
23900 52600338 2007 372,12 ?
23900 52600413 2007 2.353,34 ?
23900 52600414 2007 750,00 ?
23900 75130 2007 1.605,58 ?
23900 S0526073 2007 900,02 ?
23900 S076172A 2007 1.330,56 ?
23900 SO526113 2007 1.232,88 ?
23900 SO76136 2007 3.583,34 ?

Basicamente seria en la primera consulta añadir los importes pendiente de
la segunda consulta


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida