none
Soma com variáveis diferentes RRS feed

  • Pergunta

  • Bom dia!!

    Tenho uma coluna chamada codcaixa, sequencial, coo, hora, data e qtde e preciso ter o resultado somente da coluna qtde filtrando por data. O resultado utilizando o sum(qtde) não funciona pois o resultado são todas as linhas que contém todas as colunas que disse anteriormente.

    sexta-feira, 1 de novembro de 2013 12:14

Respostas

  • Você deveria a princípio retirar a coluna ITM.QTDNOTA da Group By, mas acredito que nesse caso não será obtido o resultado desejado porque serão geradas todas as combinações possíveis entre os itens (das tabelas CaixaGeral e ItmEntradaNF) para depois ser feita a soma.

    Para esse caso acho que será necessário somar separadamente para depois juntar:

    with 
        CTE_CX as
        (
            select
                CX.CODPROD,  
                SUM(CX.QTD) AS QTDVENDIDA
            from CAIXAGERAL CX
            where
                CX.DATA BETWEEN CONVERT(datetime, '01/10/2013', 103) AND CONVERT(datetime, '10/10/2013', 103)
            group by
                CX.CODPROD
        ),
    
        CTE_ITM as
        (
            select 
                ITM.CODPROD, 
                sum(ITM.QTDNOTA) as QTDE
            from ENTRADANF NF
            inner join ITMENTRADANF ITM
                on ITM.CODENTRADANF = NF.CODENTRADANF
            where
                NF.DTENTRADA BETWEEN CONVERT(datetime, '01/10/2013', 103) AND CONVERT(datetime, '10/10/2013', 103) and
                ( (NF.SERIE = '999' AND NF.MODELO='55') OR (NF.SERIE<>'999') ) and
                ITM.CODPROD = P.CODPROD 
            group by 
                ITM.CODPROD
        )
    
    
    select 
        g.descricao AS CATEGORIA, 
        p.BARRA AS BARRA, 
        p.DESCRICAO AS DESCRICAO, 
        CX.QTDVENDIDA, 
        p.preco_cust as "PREÇO CUSTO", 
        p.PRECO_UNIT AS CUSTO, 
        P.ESTOQUE, 
        ITM.QTDE
    from produtos p
    inner join grupo g
        on g.codgrupo = p.codgrupo
    left join CTE_CX CX
        on cx.CODPROD = p.CODPROD
    left join CTE_ITM ITM
        on ITM.CODPROD = p.CODPROD
    

    Espero que ajude.


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

    • Marcado como Resposta Giovani Cr quarta-feira, 6 de novembro de 2013 18:22
    sexta-feira, 1 de novembro de 2013 19:27

Todas as Respostas

  • Diego, você está tentando fazer um group by com sum()?

    não entendi direito a sua necessidade.
    Você pode detalhar melhor por favor? se possivel coloque algum exemplo de como estão os dados na tabela e qual o resultado esperado.


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    sexta-feira, 1 de novembro de 2013 12:17
  • Segue a imagem pra você entender
    sexta-feira, 1 de novembro de 2013 13:43
  • Deleted
    sexta-feira, 1 de novembro de 2013 14:10
  • Eu preciso que a qtde que apareceu nessa imagem apareça somente 1 linha. Por ex: caixa 5 tem que aparecer somente 1 linha com o total de qtde e não várias linhas

    Segue o sql:

    select g.descricao AS CATEGORIA, p.BARRA AS BARRA, p.DESCRICAO AS DESCRICAO, SUM(CX.QTD) AS "QTD VENDIDA (-2)"
    from
    produtos p,
    grupo g,
    CAIXAGERAL CX
    where
    (CX.DATA BETWEEN CONVERT(datetime, '01/08/2013', 103) AND CONVERT(datetime, '01/08/2013', 103))
    and g.codgrupo=p.codgrupo
    and cx.CODPROD=p.CODPROD
    and 0=0
    and cx.CODPROD='11'
    group by g.descricao, p.BARRA, p.DESCRICAO, CX.QTD


    • Editado Diegodcr sexta-feira, 1 de novembro de 2013 15:15
    sexta-feira, 1 de novembro de 2013 15:13
  • Diego,

    Neste caso, talvez seja necessário utilizar o comando Distinct ou então o TOP 1, mas como você esta fazendo o agrupamento por g.Descricao, Barra, p.Descricao e CX.QTD o plano de execução acaba definindo como Result Set este conjunto pois existe uma variação de dados que não conseguem ser agrupados.

    Você precisar realmente neste Select trazer todos estes dados?

    Será que uma SubQuery ou CTE não ajudaria?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 1 de novembro de 2013 16:49
  • Eu não tenho conhecimento com SubQuery ou CTE porém se puder ajudar agradeço muito.

    Sobre o resultado realmente eu preciso de todos eles como resultado porém se não for viável posso ter 2 selects

    sexta-feira, 1 de novembro de 2013 17:12
  • Boa tarde,

    Diego, experimente remover a coluna CX.QTD da clausula Group By para ver se é obtido o resultado desejado:

    group by g.descricao, p.BARRA, p.DESCRICAO

    Espero que ajude.


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

    sexta-feira, 1 de novembro de 2013 18:01
  • Boa tarde,

    Diego, experimente remover a coluna CX.QTD da clausula Group By para ver se é obtido o resultado desejado:

    group by g.descricao, p.BARRA, p.DESCRICAO

    Espero que ajude.


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

    Pronto era isso que faltava.

    Agora deu outro problema na seguinte query que também preciso do total da qtde da NF porém é de fornecedor diferente:

    select g.descricao AS CATEGORIA, p.BARRA AS BARRA, p.DESCRICAO AS DESCRICAO, SUM(CX.QTD) AS "QTD VENDIDA", p.preco_cust as "PREÇO CUSTO", p.PRECO_UNIT AS CUSTO, P.ESTOQUE, sum(ITM.QTDNOTA) as QTDE
    from
    produtos p,
    grupo g,
    CAIXAGERAL CX,
    FORNECEDORES f,
    ENTRADANF NF,
    ITMENTRADANF ITM
    where
    (CX.DATA BETWEEN CONVERT(datetime, '01/10/2013', 103) AND CONVERT(datetime, '10/10/2013', 103))
    and g.codgrupo=p.codgrupo
    and p.CODPROD=cx.CODPROD
    and NF.CODENTRADANF=ITM.CODENTRADANF
    AND F.CODFORNEC=NF.CODFORNEC
    AND ITM.CODPROD=P.CODPROD
    AND (NF.DTENTRADA BETWEEN CONVERT(datetime, '01/10/2013', 103) AND CONVERT(datetime, '10/10/2013', 103))
    AND ( (NF.SERIE = '999' AND NF.MODELO='55') OR (NF.SERIE<>'999') )
    AND ( (NF.SERIE = '999' AND NF.MODELO='55') OR (NF.SERIE<>'999') )
    AND ITM.CODPROD='0011'
    group by g.descricao , p.BARRA , p.DESCRICAO , p.preco_cust, p.PRECO_UNIT, P.ESTOQUE,ITM.QTDNOTA
    • Editado Diegodcr sexta-feira, 1 de novembro de 2013 18:58
    sexta-feira, 1 de novembro de 2013 18:48
  • Você deveria a princípio retirar a coluna ITM.QTDNOTA da Group By, mas acredito que nesse caso não será obtido o resultado desejado porque serão geradas todas as combinações possíveis entre os itens (das tabelas CaixaGeral e ItmEntradaNF) para depois ser feita a soma.

    Para esse caso acho que será necessário somar separadamente para depois juntar:

    with 
        CTE_CX as
        (
            select
                CX.CODPROD,  
                SUM(CX.QTD) AS QTDVENDIDA
            from CAIXAGERAL CX
            where
                CX.DATA BETWEEN CONVERT(datetime, '01/10/2013', 103) AND CONVERT(datetime, '10/10/2013', 103)
            group by
                CX.CODPROD
        ),
    
        CTE_ITM as
        (
            select 
                ITM.CODPROD, 
                sum(ITM.QTDNOTA) as QTDE
            from ENTRADANF NF
            inner join ITMENTRADANF ITM
                on ITM.CODENTRADANF = NF.CODENTRADANF
            where
                NF.DTENTRADA BETWEEN CONVERT(datetime, '01/10/2013', 103) AND CONVERT(datetime, '10/10/2013', 103) and
                ( (NF.SERIE = '999' AND NF.MODELO='55') OR (NF.SERIE<>'999') ) and
                ITM.CODPROD = P.CODPROD 
            group by 
                ITM.CODPROD
        )
    
    
    select 
        g.descricao AS CATEGORIA, 
        p.BARRA AS BARRA, 
        p.DESCRICAO AS DESCRICAO, 
        CX.QTDVENDIDA, 
        p.preco_cust as "PREÇO CUSTO", 
        p.PRECO_UNIT AS CUSTO, 
        P.ESTOQUE, 
        ITM.QTDE
    from produtos p
    inner join grupo g
        on g.codgrupo = p.codgrupo
    left join CTE_CX CX
        on cx.CODPROD = p.CODPROD
    left join CTE_ITM ITM
        on ITM.CODPROD = p.CODPROD
    

    Espero que ajude.


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

    • Marcado como Resposta Giovani Cr quarta-feira, 6 de novembro de 2013 18:22
    sexta-feira, 1 de novembro de 2013 19:27
  • Você deveria a princípio retirar a coluna ITM.QTDNOTA da Group By, mas acredito que nesse caso não será obtido o resultado desejado porque serão geradas todas as combinações possíveis entre os itens (das tabelas CaixaGeral e ItmEntradaNF) para depois ser feita a soma.

    Para esse caso acho que será necessário somar separadamente para depois juntar:

    with 
        CTE_CX as
        (
            select
                CX.CODPROD,  
                SUM(CX.QTD) AS QTDVENDIDA
            from CAIXAGERAL CX
            where
                CX.DATA BETWEEN CONVERT(datetime, '01/10/2013', 103) AND CONVERT(datetime, '10/10/2013', 103)
            group by
                CX.CODPROD
        ),
    
        CTE_ITM as
        (
            select 
                ITM.CODPROD, 
                sum(ITM.QTDNOTA) as QTDE
            from ENTRADANF NF
            inner join ITMENTRADANF ITM
                on ITM.CODENTRADANF = NF.CODENTRADANF
            where
                NF.DTENTRADA BETWEEN CONVERT(datetime, '01/10/2013', 103) AND CONVERT(datetime, '10/10/2013', 103) and
                ( (NF.SERIE = '999' AND NF.MODELO='55') OR (NF.SERIE<>'999') ) and
                ITM.CODPROD = P.CODPROD 
            group by 
                ITM.CODPROD
        )
    
    
    select 
        g.descricao AS CATEGORIA, 
        p.BARRA AS BARRA, 
        p.DESCRICAO AS DESCRICAO, 
        CX.QTDVENDIDA, 
        p.preco_cust as "PREÇO CUSTO", 
        p.PRECO_UNIT AS CUSTO, 
        P.ESTOQUE, 
        ITM.QTDE
    from produtos p
    inner join grupo g
        on g.codgrupo = p.codgrupo
    left join CTE_CX CX
        on cx.CODPROD = p.CODPROD
    left join CTE_ITM ITM
        on ITM.CODPROD = p.CODPROD

    Espero que ajude.


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

    Bom dia!!

    Está perfeito o seu script !!

    Muito obrigado!

    segunda-feira, 4 de novembro de 2013 12:36