none
diminuir valor de frete em consulta. RRS feed

  • Pergunta

  • Pessoal,

    Tenho esta query que calcula o total de notas fiscais. Porém quero diminuir o valor do frete (campo fretevenda na consulta) que é único para a nota.
    No exemplo o frete vale 10,00. Nessa query esta diminuindo 100,00, pois esta somando 10,00 para cada item da nota e não no total. A nota possui 10 items. Se alguém puder dar uma força , fico muito grato.

    select *,totnota1 - totprod as diferenca from(
            select *,case when fretevenda is not null then (totnota - fretevenda) else totnota end as totnota1 from (
            select tm.codfilial,tm.NUMEROMOV,f.nome,tm.IDMOV,tm.DATAEMISSAO,ttm.IDPRD,tp.codigoreduzido,tp.DESCRICAO,ttm.QUANTIDADE,ttm.PRECOUNITARIO as preconota
            ,ttm.precotabela as precoprod,cb.maxdesc,cb.acrescimo, (ttm.precounitario - ttm.precotabela) as difpreco,(ttm.precounitario * ttm.quantidade - ttm.precotabela * ttm.quantidade) as difprecotot, cb.qtdecesta
            ,ttm.precounitario*ttm.quantidade as totnota,ttm.precotabela*ttm.quantidade as totprod, CAST(replace(FRETEVENDA,',','.') as numeric(10,2)) as fretevenda
            from TMOV tm
            left join tmovcompl tmc on (tmc.idmov = tm.idmov)
            inner join TITMMOV ttm on (ttm.IDMOV = tm.IDMOV)
            inner join TPRD tp on (tp.IDPRD = ttm.IDPRD)
            inner join FCFO f on (f.CODCFO = tm.codcfo)
            left join FCFOCOMPL fc on (fc.codcfo = f.codcfo)
            left join varejaocereais.dbo.cestabasica cb on (cb.codcesta = tmc.codigocestas collate database_default)
            WHERE tm.DATAEMISSAO>='27/12/2012'
            AND tm.DATAEMISSAO<='27/12/2012'
            
              AND tm.STATUS <> 'C' AND tm.CODTMV = '2.2.01' and tm.codtmv <> '2.2.29' and tm.codtmv <>'2.2.04'
            
            AND tm.codcfo not in('000337') and f.CODCFO <> '000337'
            and f.codetd = 'MG'
            and serie <> 'ECF' and tm.NUMEROMOV = '000023853'

            
              and tm.codven1 = '0005'
              
            )T1)T2
            order by numeromov,dataemissao


    sexta-feira, 15 de fevereiro de 2013 16:03

Todas as Respostas

  • Roman, bom dia!

    Isso acontece pois a granularidade de seu select esta em item e não na nota em si. Para resolver isso no select voce deve utilizar uma funçção de agregação, uma vez que o valor do frete esta sendo copiado, utiliza o max ou o min (Tanto faz). Segue exemplo

    OBS: Observar o group by interno, como não sei seus campos, não sei o que colocar, favor especificar todos os campos abstraidos no *

    SELECT

    *,TOTNOTA1 - TOTPROD AS DIFERENCA

    FROM

    (

    SELECT *,CASE WHEN FRETEVENDA IS NOT NULL THEN (TOTNOTA - MAX(FRETEVENDA)) ELSE TOTNOTA END AS TOTNOTA1

    FROM

    (

    SELECT TM.CODFILIAL,TM.NUMEROMOV,F.NOME,TM.IDMOV,TM.DATAEMISSAO,TTM.IDPRD,TP.CODIGOREDUZIDO,TP.DESCRICAO,TTM.QUANTIDADE,TTM.PRECOUNITARIO AS PRECONOTA

    ,TTM.PRECOTABELA AS PRECOPROD,CB.MAXDESC,CB.ACRESCIMO, (TTM.PRECOUNITARIO - TTM.PRECOTABELA) AS DIFPRECO,(TTM.PRECOUNITARIO * TTM.QUANTIDADE - TTM.PRECOTABELA * TTM.QUANTIDADE) AS DIFPRECOTOT, CB.QTDECESTA

    ,TTM.PRECOUNITARIO*TTM.QUANTIDADE AS TOTNOTA,TTM.PRECOTABELA*TTM.QUANTIDADE AS TOTPROD, CAST(REPLACE(FRETEVENDA,',','.') AS NUMERIC(10,2)) AS FRETEVENDA

    FROM TMOV TM

    LEFT JOIN TMOVCOMPL TMC ON (TMC.IDMOV = TM.IDMOV)

    INNER JOIN TITMMOV TTM ON (TTM.IDMOV = TM.IDMOV)

    INNER JOIN TPRD TP ON (TP.IDPRD = TTM.IDPRD)

    INNER JOIN FCFO F ON (F.CODCFO = TM.CODCFO)

    LEFT JOIN FCFOCOMPL FC ON (FC.CODCFO = F.CODCFO)

    LEFT JOIN VAREJAOCEREAIS.DBO.CESTABASICA CB ON (CB.CODCESTA = TMC.CODIGOCESTAS COLLATE DATABASE_DEFAULT)

    WHERE TM.DATAEMISSAO>='27/12/2012'

    AND TM.DATAEMISSAO<='27/12/2012'

    AND TM.STATUS <> 'C' AND TM.CODTMV = '2.2.01' AND TM.CODTMV <> '2.2.29' AND TM.CODTMV <>'2.2.04'

    AND TM.CODCFO NOT IN('000337') AND F.CODCFO <> '000337'

    AND F.CODETD = 'MG'

    AND SERIE <> 'ECF' AND TM.NUMEROMOV = '000023853'

    AND TM.CODVEN1 = '0005'

    GROUP BY * (No sei qual os campos, favor especificar todos aqui!), TOTNOTA

    )T1

    )

    T2

    ORDER

    BY NUMEROMOV,DATAEMISSAO


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    sexta-feira, 15 de fevereiro de 2013 16:10
    Moderador
  • Fabrizzio,

    Não entendi, vc colocou o group by no select mais interno (T1) e colocou a função de agregação 

    no externo (T2). Desse jeito não funciona. Esta correto?


    De qualquer forma, passei o group by para o select externo e não deu certo. Continua calculando o valor do frete multiplicado pela quantidade de items.
    • Editado romanvpp sexta-feira, 15 de fevereiro de 2013 18:56
    sexta-feira, 15 de fevereiro de 2013 18:39