PDA

Ver la Versión Completa : ORDER BY con GROUP BY y funciones de agregado


Cabanyaler
03-08-2006, 10:21:26
Hola compañeros.
Estoy intentando implementar una consulta SQL un tanto sencilla, pero que no logro a pesar de ver la ayuda del Transac_SQL.

Expongo:Tengo dos tablas, una maestra con cabeceras y otra esclava con las líneas de detalle.
La tabla de cabeceras se puede entender en este caso como si fuesen facturas, y la de líneas de detalle como las líneas de factura, p.e.

Así pues, con la consulta que expongo a continuación obtengo todas las líneas de facturas agrupadas por el codigo de artículo.


/* Retorna totes les unitats de les valoracions economiques de totes les certificacions agrupades per còdig d'unitat*/

CREATE PROCEDURE ADOSP_Unidades_Anuales

/* Parametres */
@NumCen_sp varchar(3), @FecIni_sp datetime, @FecFin_sp datetime

AS
SELECT DISTINCT
CabVal_Gesa.CodAut_CabVal, CabVal_Gesa.NumCen_CabVal, CabVal_Gesa.FecCer_CabVal,
LinVal_Gesa.Codigo_LinVal, LinVal_Gesa.CodUni_LinVal, LinVal_Gesa.NumUni_LinVal, LinVal_Gesa.DesUni_LinVal, LinVal_Gesa.MatEuros_LinVal, LinVal_Gesa.ManEuros_LinVal

FROM
CabVal_Gesa
/* Unisc per C.Aj */
LEFT OUTER JOIN LinVal_Gesa
ON CabVal_Gesa.CodAut_CabVal = LinVal_Gesa.Codigo_LinVal

WHERE
(
(CabVal_Gesa.NumCen_CabVal LIKE '%' + @NumCen_sp + '%' )
AND (CabVal_Gesa.FecCer_CabVal >= @FecIni_sp AND CabVal_Gesa.FecCer_CabVal <= @FecFin_sp)
)


ORDER BY LinVal_Gesa.CodUni_LinVal
GO





Lo que me gustaría obtener es: en lugar de todas las líneas de todas las facturas agrupadas por el código de artículo de las mismas, desearía obtener todos los artículos que se han facturado en líneas de las facturas acumulando los totales de los mismos en una sóla linea por cada uno de los artículos.

Algo así (resumiendo en número de columnas respecto del código anexo original):

ARTICULO TOTAL UNI.FACTURADAS AÑO PRECIO TOTAL
--------------------------------------------------------------------------
A 10 5 50
B 20 10 200
C 100 20 200


Si me podeis ayudar....., gracias.

vtdeleon
03-08-2006, 16:37:49
desearía obtener todos los artículossóla linea por cada uno de los artículos.Siento alguna contradiccion o mi no entender:confused:

Sin entender podria decir que deberias utilizar Group By CodigoArticulo y en el area del Select agregar un Sum(Total).

Saludos

Cabanyaler
04-08-2006, 08:33:07
Si eso es lo que buscaba, más o menos, ya que el group by agruparía (valga la redundancia) todas las líneas de los artículos, pero yo además no quiero sacar todas las líneas agrupadas de un mismo artículo sino por cada grupo de esos artículos debería salir una sóla línea con el sumatorio de las cantidades de todas las líneas pertenecientes al determinado artículo. Gracias.
Pero la sintaxis és la que me puede en este caso, ya que no logro hacer una sintaxis correcta.
No obstante lo he resuelto con algorítmica, y es por ello por lo que me he conectado, para publicarla.
Pero preferiría, claramente, hacer el proceso en el servidor.. claro, en lugar de en la consola del cliente.

Gracias. :)


// Ara he de recorrer tota la consulta per agrupar en una mateixa linea tots els valors
Final_w := False;
Cantidad_unidades_w := 0;

DMCertGESA.ADOSP_InfUniAny.First;
if(DMCertGESA.ADOSP_InfUniAny.RecNo = DMCertGESA.ADOSP_InfUniAny.RecordCount) then
Final_w := true;
NumUni_ant := DMCertGESA.ADOSP_InfUniAnyCodUni_LinVal.value;
DMCertGESA.ADOSP_InfUniAny.Next;

if(DMCertGESA.ADOSP_InfUniAny.RecNo = DMCertGESA.ADOSP_InfUniAny.RecordCount) then
Final_w := true;

while not(DMCertGESA.ADOSP_InfUniAny.Eof) and (not(Final_W)) do
begin
if(NumUni_ant = DMCertGESA.ADOSP_InfUniAnyCodUni_LinVal.value) then
begin
NumUni_ant := DMCertGESA.ADOSP_InfUniAnyCodUni_LinVal.value;
Cantidad_unidades_w := DMCertGESA.ADOSP_InfUniAnyNumUni_LinVal.Value;
DMCertGESA.ADOSP_InfUniAny.Prior;
DMCertGESA.ADOSP_InfUniAny.Edit;
DMCertGESA.ADOSP_InfUniAnyNumUni_LinVal.Value := DMCertGESA.ADOSP_InfUniAnyNumUni_LinVal.Value + Cantidad_unidades_w;
DMCertGESA.ADOSP_InfUniAny.Post;
DMCertGESA.ADOSP_InfUniAny.Next;
DMCertGESA.ADOSP_InfUniAny.Delete;
Cantidad_unidades_w := 0;
end
else
begin
NumUni_ant := DMCertGESA.ADOSP_InfUniAnyCodUni_LinVal.value;
DMCertGESA.ADOSP_InfUniAny.Next;
end;

if(DMCertGESA.ADOSP_InfUniAny.RecNo = DMCertGESA.ADOSP_InfUniAny.RecordCount) then
Final_w := true;
end;
DMCertGESA.ADOSP_InfUniAny.First;
// ****** Fin de l'agrupació de les unitats acumulan-les a la mateixa linea