none
Consulta para contar numero de lineas y operarlo RRS feed

  • Pregunta

  • Buen día comunidad

    tengo una consulta

    Tengo unas facturas con sus detalles, hay unas facturas que tienen solo 1 detalle y otras que tienen 2 o mas por lo cual yo necesito para efectos de un reporte tomar ese numero de detalles y operarlo en una formula.

    en mi caso es que tengo que dividir una cantidad "X" por el numero de detalles (filas) que tenga la factura

    SELECT

     count (FacProve.DocNum) as TotalLinea
    ,sum (case 
     when FacProve.WTSum <> 0
     then FacDesc.GTotal + FacProve.TotalExpns - (FacProve.WTSum / AQUI EL TOTAL DE LINEAS )
     else FacDesc.GTotal + FacProve.TotalExpns END) as TatalFac


    from "REMISA2017".opch FacProve
    INNER JOIN "REMISA2017".PCH1 FacDesc on FacProve.DocEntry = FacDesc.DocEntry
    LEFT JOIN "REMISA2017".OVPM Pagos ON FacProve."ReceiptNum" = Pagos."DocEntry"

    WHERE 
    FacProve.CardName = 'JUAN CARLOS LIMA OSCAL' 
    AND FacProve.PaidToDate <= 0

    group by FacProve.DocNum


    resultado de mi consuta

    TotalLinea    (TatalFac)
    1          3500.00000000
    4          18500.00000000
    1               3460.93750000
    1          3000.00000000
    3              7732.14500000


    Gracias!!!

    lunes, 25 de febrero de 2019 17:40

Respuestas

  • Deleted
    • Marcado como respuesta Mayau martes, 26 de febrero de 2019 15:24
    lunes, 25 de febrero de 2019 20:57
  • Hola Mayau:

    Te pongo una posible solución.

    Primero el escenario, para emular tus datos.

    create table facProve (DocNum int, WTSum float, DocEntry int, TotalExpns int, CardName varchar(100), PaidToDate int, ReceiptNum int)
    create table FacDesc (GTotal float, DocEntry int, linea int)
    create table pagos(docEntry int, id int)
    go
    insert into facProve (docnum, wtsum, docEntry, totalExpns, CardName, PaidToDate, ReceiptNum)
    values
    (1,100, 1, 5, 'JUAN CARLOS LIMA OSCAL',-1, 1),
    (2,100, 2, 5, 'JUAN CARLOS LIMA OSCAL',-1, 2),
    (3,100, 3, 5, 'Otro',-1, 3),
    (4,100, 4, 5, 'JUAN CARLOS LIMA OSCAL',-1, 4),
    (5,100, 5, 5, 'Varios',-1, 5),
    (6,100, 6, 5, 'JUAN CARLOS LIMA OSCAL',-1, 6);
    go
    insert into FacDesc(gTotal, docEntry, linea)
    values
    (15,1,1),
    (15,1,2),
    (15,1,3),
    (30,2,1),
    (30,2,2),
    (15,3,1),
    (15,3,2),
    (15,4,1),
    (30,4,2),
    (30,5,1),
    (15,5,2),
    (15,6,1),
    (30,6,2),
    (30,6,3);
    go
    insert into pagos (docEntry, id)
    values
     (1,1),
     (2,2),
     (4,4),
     (5,5);
    go
     
    

    Aunque los campos no sean exactamente iguales, ni del mismo tipo, como no has colocado tu origen, pues he escogido algo que pueda encajar.

    Una solución sería el operador apply

    SELECT COUNT(FacProve.DocNum) AS TotalLinea, 
        
           SUM(CASE
                   WHEN FacProve.WTSum <> 0
                   THEN FacDesc.GTotal + FacProve.TotalExpns - (FacProve.WTSum / lineasPorFac)
                   ELSE FacDesc.GTotal + FacProve.TotalExpns
               END) AS TatalFac
    FROM FacProve
         INNER JOIN FacDesc ON FacProve.DocEntry = FacDesc.DocEntry
         CROSS APPLY
    (
        SELECT COUNT(a.linea) AS lineasPorFac, 
               a.DocEntry
        FROM FacDesc a
        WHERE FacDesc.DocEntry = a.DocEntry
        GROUP BY a.DocEntry
    ) AS lin
         LEFT JOIN Pagos ON FacProve.ReceiptNum = Pagos."DocEntry"
    WHERE FacProve.CardName = 'JUAN CARLOS LIMA OSCAL'
          AND FacProve.PaidToDate <= 0
    GROUP BY FacProve.DocNum, 
             lin.lineasPorFac, 
             lin.DocEntry;

    Observa que te he quitado los nombres originales de las tablas y me he quedado con sus alias.

    Dentro del conjunto que he llamado lin, tienes la cuenta de las lineas por documento.

    Espero te ayude

    • Propuesto como respuesta Pedro Alfaro lunes, 25 de febrero de 2019 21:19
    • Marcado como respuesta Mayau martes, 26 de febrero de 2019 15:24
    lunes, 25 de febrero de 2019 21:07

Todas las respuestas

  • Deleted
    • Marcado como respuesta Mayau martes, 26 de febrero de 2019 15:24
    lunes, 25 de febrero de 2019 20:57
  • Hola Mayau:

    Te pongo una posible solución.

    Primero el escenario, para emular tus datos.

    create table facProve (DocNum int, WTSum float, DocEntry int, TotalExpns int, CardName varchar(100), PaidToDate int, ReceiptNum int)
    create table FacDesc (GTotal float, DocEntry int, linea int)
    create table pagos(docEntry int, id int)
    go
    insert into facProve (docnum, wtsum, docEntry, totalExpns, CardName, PaidToDate, ReceiptNum)
    values
    (1,100, 1, 5, 'JUAN CARLOS LIMA OSCAL',-1, 1),
    (2,100, 2, 5, 'JUAN CARLOS LIMA OSCAL',-1, 2),
    (3,100, 3, 5, 'Otro',-1, 3),
    (4,100, 4, 5, 'JUAN CARLOS LIMA OSCAL',-1, 4),
    (5,100, 5, 5, 'Varios',-1, 5),
    (6,100, 6, 5, 'JUAN CARLOS LIMA OSCAL',-1, 6);
    go
    insert into FacDesc(gTotal, docEntry, linea)
    values
    (15,1,1),
    (15,1,2),
    (15,1,3),
    (30,2,1),
    (30,2,2),
    (15,3,1),
    (15,3,2),
    (15,4,1),
    (30,4,2),
    (30,5,1),
    (15,5,2),
    (15,6,1),
    (30,6,2),
    (30,6,3);
    go
    insert into pagos (docEntry, id)
    values
     (1,1),
     (2,2),
     (4,4),
     (5,5);
    go
     
    

    Aunque los campos no sean exactamente iguales, ni del mismo tipo, como no has colocado tu origen, pues he escogido algo que pueda encajar.

    Una solución sería el operador apply

    SELECT COUNT(FacProve.DocNum) AS TotalLinea, 
        
           SUM(CASE
                   WHEN FacProve.WTSum <> 0
                   THEN FacDesc.GTotal + FacProve.TotalExpns - (FacProve.WTSum / lineasPorFac)
                   ELSE FacDesc.GTotal + FacProve.TotalExpns
               END) AS TatalFac
    FROM FacProve
         INNER JOIN FacDesc ON FacProve.DocEntry = FacDesc.DocEntry
         CROSS APPLY
    (
        SELECT COUNT(a.linea) AS lineasPorFac, 
               a.DocEntry
        FROM FacDesc a
        WHERE FacDesc.DocEntry = a.DocEntry
        GROUP BY a.DocEntry
    ) AS lin
         LEFT JOIN Pagos ON FacProve.ReceiptNum = Pagos."DocEntry"
    WHERE FacProve.CardName = 'JUAN CARLOS LIMA OSCAL'
          AND FacProve.PaidToDate <= 0
    GROUP BY FacProve.DocNum, 
             lin.lineasPorFac, 
             lin.DocEntry;

    Observa que te he quitado los nombres originales de las tablas y me he quedado con sus alias.

    Dentro del conjunto que he llamado lin, tienes la cuenta de las lineas por documento.

    Espero te ayude

    • Propuesto como respuesta Pedro Alfaro lunes, 25 de febrero de 2019 21:19
    • Marcado como respuesta Mayau martes, 26 de febrero de 2019 15:24
    lunes, 25 de febrero de 2019 21:07
  • Gracias compañero! 
    martes, 26 de febrero de 2019 15:25
  • Gracias por tu ayuda!

    martes, 26 de febrero de 2019 15:25