Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   ORDER BY con GROUP BY y funciones de agregado (https://www.clubdelphi.com/foros/showthread.php?t=34268)

Cabanyaler 03-08-2006 10:21:26

ORDER BY con GROUP BY y funciones de agregado
 
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.

Código SQL [-]
/* 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):
Código Delphi [-]
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

Cita:

desearía obtener todos los artículos
Cita:

só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. :)

Código Delphi [-]
 // 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


La franja horaria es GMT +2. Ahora son las 18:27:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi