none
Montar Query Sem o SubSelect RRS feed

  • Pergunta

  • Preciso montar uma consulta para o Fluxo de caixa da empresa:

    Tenho a tabela dos boletos que irei receber   ( Faco Inner join na tabela de clientes para buscar o nome)

       BOLETO  |  NOME CLIENTE | ORDEM VENDA | DATA DO BOLETO

    Tenho a tabela das contas a pagar 

       BOLETO | NOME DO FORNECEDOR | ORDEM COMPRA | DATA DO BOLETO

     Tinha feito uma select nos contas a pagar e um subselect nos contas a receber onde a data do pagar igual a data do receber.

      O resultado é

         A PAGAR   |   DATA         |   A RECEBER

           R$ 100    | 2014-09-10  |    R$ 300

     Mas se tiver um dia que não tenho contas a pagar, não busca nesta data o contas a receber.
     Alguem tem uma sugestão para o resultado esperado

     Se não tiver na à pagar, trazer a linha com o a receber.

    quinta-feira, 27 de novembro de 2014 12:59

Respostas

  • Bom dia,

    William, segue abaixo um script, que acredito que pode ser adaptado para o seu caso, onde é utilizado Full Join:

    declare @ContasReceber table
    (Data date, Valor money);
    
    insert into @ContasReceber values
    ('20141130', 1000),
    ('20141130', 500),
    ('20141202', 600);
    
    declare @ContasPagar table
    (Data date, Valor money);
    
    insert into @ContasPagar values
    ('20141130', 800),
    ('20141201', 300),
    ('20141201', 400);
    
    with 
        CTE_Receber as
        (
            select
                Data,
                SUM(Valor) as Total
            from @ContasReceber
            group by
                Data
        ),
    
        CTE_Pagar as
        (
            select
                Data,
                SUM(Valor) as Total
            from @ContasPagar
            group by
                Data
        )
        
    select
        coalesce(r.Data, p.Data) as Data,
        r.Total as [A Receber],
        p.Total as [A Pagar]
    from CTE_Receber as r
    full join CTE_Pagar as p
       on p.Data = r.Data

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta William_droops quinta-feira, 27 de novembro de 2014 15:23
    quinta-feira, 27 de novembro de 2014 13:31

Todas as Respostas

  • Mostra a consulta que vc montou.
    quinta-feira, 27 de novembro de 2014 13:02
  • SELECT   
    		
    		SUM(VENDTRANSOPEN.AMOUNTMST)     AS [VALOR A PAGAR] 
            ,VENDTRANSOPEN.DUEDATE   AS DATA
            ,    ( SELECT  
    			         SUM(CUSTTRANSOPEN.AMOUNTMST)         
                  FROM SALESTABLE
    		             INNER JOIN CUSTINVOICEJOUR ON CUSTINVOICEJOUR.DATAAREAID   = SALESTABLE.DATAAREAID			 AND
                                    CUSTINVOICEJOUR.ORDERACCOUNT = SALESTABLE.INVOICEACCOUNT		 AND
                                    CUSTINVOICEJOUR.SALESID      = SALESTABLE.SALESID    
                         INNER JOIN CUSTTRANS   ON	CUSTTRANS.DATAAREAID  = CUSTINVOICEJOUR.DATAAREAID		AND
    		                                        CUSTTRANS.VOUCHER	 = CUSTINVOICEJOUR.LEDGERVOUCHER    AND
    		                                        CUSTTRANS.ACCOUNTNUM = CUSTINVOICEJOUR.INVOICEACCOUNT	AND
    		                                        CUSTTRANS.TRANSDATE  = CUSTINVOICEJOUR.INVOICEDATE 
    		       		LEFT OUTER JOIN CUSTTRANSOPEN ON CUSTTRANS.DATAAREAID        = CUSTTRANSOPEN.DATAAREAID			AND
    		                                             CUSTTRANS.ACCOUNTNUM        = CUSTTRANSOPEN.ACCOUNTNUM			AND
    		                                             CUSTTRANS.RECID			    = CUSTTRANSOPEN.REFRECID
    		      WHERE  
    		  CUSTTRANSOPEN.DUEDATE = VENDTRANSOPEN.DUEDATE   AND
    		  SALESTABLE.DATAAREAID = @AX_COMPANYNAME
                GROUP BY
             CUSTTRANSOPEN.DUEDATE
      
     ) AS  [VALOR A RECEBER]
            
        FROM PURCHTABLE
    	         INNER JOIN VENDTABLE       ON  VENDTABLE.DATAAREAID = PURCHTABLE.DATAAREAID  AND  VENDTABLE.ACCOUNTNUM = PURCHTABLE.ORDERACCOUNT	    		
    		     INNER JOIN VENDINVOICEJOUR ON VENDINVOICEJOUR.DATAAREAID   = PURCHTABLE.DATAAREAID	AND  VENDINVOICEJOUR.ORDERACCOUNT = PURCHTABLE.ORDERACCOUNT	AND  VENDINVOICEJOUR.PURCHID      = PURCHTABLE.PURCHID
                 INNER JOIN VENDTRANS       ON VENDTRANS.DATAAREAID         = VENDINVOICEJOUR.DATAAREAID AND VENDTRANS.VOUCHER = VENDINVOICEJOUR.LEDGERVOUCHER  AND  VENDTRANS.ACCOUNTNUM  = VENDINVOICEJOUR.INVOICEACCOUNT	AND VENDTRANS.TRANSDATE	       = VENDINVOICEJOUR.INVOICEDATE 
    		     INNER JOIN VENDTRANSOPEN   ON VENDTRANS.DATAAREAID        = VENDTRANSOPEN.DATAAREAID 	AND  VENDTRANS.ACCOUNTNUM = VENDTRANSOPEN.ACCOUNTNUM AND   VENDTRANS.RECID	= VENDTRANSOPEN.REFRECID
        WHERE		
    		(VENDTRANSOPEN.DUEDATE >= CONVERT( DATETIME , @DATA_INICIAL, 103)  AND VENDTRANSOPEN.DUEDATE <= CONVERT( DATETIME , @DATA_FINAL, 103))
    		AND PURCHTABLE.DATAAREAID = @AX_COMPANYNAME 
    		AND VENDTRANSOPEN.DUEDATE <> CONVERT( DATETIME , '01/01/1900', 103)
    		AND VENDTABLE.VENDGROUP NOT IN ('CLIENTES')
    		
    	GROUP BY
    		 	VENDTRANSOPEN.DUEDATE

    • Editado William_droops quinta-feira, 27 de novembro de 2014 13:17 Ficou dificil compreender
    quinta-feira, 27 de novembro de 2014 13:13
  • Bom dia,

    William, segue abaixo um script, que acredito que pode ser adaptado para o seu caso, onde é utilizado Full Join:

    declare @ContasReceber table
    (Data date, Valor money);
    
    insert into @ContasReceber values
    ('20141130', 1000),
    ('20141130', 500),
    ('20141202', 600);
    
    declare @ContasPagar table
    (Data date, Valor money);
    
    insert into @ContasPagar values
    ('20141130', 800),
    ('20141201', 300),
    ('20141201', 400);
    
    with 
        CTE_Receber as
        (
            select
                Data,
                SUM(Valor) as Total
            from @ContasReceber
            group by
                Data
        ),
    
        CTE_Pagar as
        (
            select
                Data,
                SUM(Valor) as Total
            from @ContasPagar
            group by
                Data
        )
        
    select
        coalesce(r.Data, p.Data) as Data,
        r.Total as [A Receber],
        p.Total as [A Pagar]
    from CTE_Receber as r
    full join CTE_Pagar as p
       on p.Data = r.Data

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta William_droops quinta-feira, 27 de novembro de 2014 15:23
    quinta-feira, 27 de novembro de 2014 13:31