none
Fazendo uma Somatoria RRS feed

  • Pergunta

  • Olá pessoal,

    Estou com uma dúvida, por favor, alguém pode me ajudar?

    Tenho o código abaixo que está fazendo a multiplicação dos valores me dando o total_01 (Total por pessoa), como eu faço para ter um total geral, somando todo o total_01

    Por favor, alguém pode me ajudar?

    Muito obrigado

    SELECT
        TOP 10
    	ProductID,
    	OrderQty,
    	UnitPrice,
    --	OrderQty*UnitPrice AS Total
    	OrderQty*ISNULL(UnitPrice,0) AS 'Total_01'
    FROM
    	Sales.SalesOrderDetail


    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 21 de fevereiro de 2013 14:44

Respostas

  • Wellington,

    Abaixo um script que faz o que voce esta querendo.

    IF

    (EXISTS(SELECT TOP 1 1 FROM sys.tables WHERE name LIKE 'TabelaVendas'))

    DROP TABLE TabelaVendas

    CREATE

    TABLE TabelaVendas

    (

    Id_Produto

    INT,

    Qtde

    INT,

    PrecoUnitario

    DECIMAL(18,2)

    )

    INSERT

    INTO TabelaVendas(Id_Produto, Qtde, PrecoUnitario)

    VALUES

    (

    1, 1, 5),

    (

    2, 2, 5),

    (

    3, 3, 5),

    (

    4, 4, 5),

    (

    5, 5, 5)

    SELECT

    ISNULL(CAST(a.Id_Produto AS VARCHAR(100)), 'Total geral') As Id_Produto,

    a

    .Qtde,

    a

    .PrecoUnitario,

    a

    .[Total 01]

    FROM

    (

    SELECT Id_Produto, Qtde, PrecoUnitario, SUM(Qtde*PrecoUnitario) As [Total 01]

    FROM TabelaVendas

    GROUP BY CUBE(Id_Produto, Qtde, PrecoUnitario)

    )

    a

    WHERE

    a.[Total 01] IS NOT NULL

    AND

    (

    (Id_Produto IS NOT NULL AND Qtde IS NOT NULL AND PrecoUnitario IS NOT NULL)

    OR

    (Id_Produto IS NULL AND Qtde IS NULL AND PrecoUnitario IS NULL)

    )


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

    quinta-feira, 21 de fevereiro de 2013 18:40
    Moderador
  • Boa tarde,

    A partir do SQL Server 2008 você pode utilizar Grouping Sets mais ou menos como segue:

    SELECT
        Id_Produto,
        Qtde,
        PrecoUnitario,
        SUM(Qtde * PrecoUnitario) as [Total 01]
    FROM TabelaVendas
    GROUP BY GROUPING SETS ((Id_Produto, Qtde, PrecoUnitario), ())

    Espero que seja útil.


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

    quinta-feira, 21 de fevereiro de 2013 20:57

Todas as Respostas

  • Wellinghton,

    Ficaria assim:

    SELECT
        	SUM(OrderQty*ISNULL(UnitPrice,0)) AS 'Total_01'
    FROM
    	Sales.SalesOrderDetail



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

    quinta-feira, 21 de fevereiro de 2013 16:15
    Moderador
  • Não entendi, você quer o o total por pessoa, ou o total geral ? No seu exemplo não tem o group by por pessoa...

    Quer que o total seja repetido em todas as linhas? Ou quer o total em outro resultset ?

    Abs.


    Fabiano Neves Amorim - SQL Server MVP http://blogfabiano.com/

    quinta-feira, 21 de fevereiro de 2013 16:16
  • De uma olhada neste comando:

    ROLL UP


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 21 de fevereiro de 2013 18:28
  • Wellington,

    Abaixo um script que faz o que voce esta querendo.

    IF

    (EXISTS(SELECT TOP 1 1 FROM sys.tables WHERE name LIKE 'TabelaVendas'))

    DROP TABLE TabelaVendas

    CREATE

    TABLE TabelaVendas

    (

    Id_Produto

    INT,

    Qtde

    INT,

    PrecoUnitario

    DECIMAL(18,2)

    )

    INSERT

    INTO TabelaVendas(Id_Produto, Qtde, PrecoUnitario)

    VALUES

    (

    1, 1, 5),

    (

    2, 2, 5),

    (

    3, 3, 5),

    (

    4, 4, 5),

    (

    5, 5, 5)

    SELECT

    ISNULL(CAST(a.Id_Produto AS VARCHAR(100)), 'Total geral') As Id_Produto,

    a

    .Qtde,

    a

    .PrecoUnitario,

    a

    .[Total 01]

    FROM

    (

    SELECT Id_Produto, Qtde, PrecoUnitario, SUM(Qtde*PrecoUnitario) As [Total 01]

    FROM TabelaVendas

    GROUP BY CUBE(Id_Produto, Qtde, PrecoUnitario)

    )

    a

    WHERE

    a.[Total 01] IS NOT NULL

    AND

    (

    (Id_Produto IS NOT NULL AND Qtde IS NOT NULL AND PrecoUnitario IS NOT NULL)

    OR

    (Id_Produto IS NULL AND Qtde IS NULL AND PrecoUnitario IS NULL)

    )


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

    quinta-feira, 21 de fevereiro de 2013 18:40
    Moderador
  • Fabrizzio então eu preciso que fique alguma coisa parecida com a tabela a baixo, já tentei usar o ROLLUP de diversas formas mais não está dando certo.

    Esse total geral pode ficar de lado ou a baixo mesmo, não tem problema.

    Tentei usar assim o ROLLUP ( OrderQty*ISNULL(UnitPrice,0) ),

    mais uma vez muito obrigado.

    Gostaria que ficasse assim:

    ProductID OrderQtd UnitPrice Total_01
    776 1 2024,994 2024,994
    777 3 2024,994 6074,982
    778 1 2024,994 2024,994
    771 1 2039,994 2039,994
    772 1 2039,994 2039,994
    Total Geral                                                                                                     14204,958


    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 21 de fevereiro de 2013 18:40
  • Veja um exemplo acima.


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

    quinta-feira, 21 de fevereiro de 2013 18:42
    Moderador
  • Então meu amigo, o script que você me passou fez exatamente o que eu preciso, vou fazer os meus testes aqui, qualquer dúvida te aviso :)

    Muito obrigado mesmo


    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 21 de fevereiro de 2013 18:47
  • Fabrizzio, como eu te falei o seu exemplo funcionou perfeitamente, mais como sou novato em SQL e tem uns 2 meses que eu focado meus estudos em SQL vou ser sincero está bem complexo pra eu entender o funcionamento do script  srsrssrsrrssrrssrsrsrs

    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 21 de fevereiro de 2013 20:00
  • Boa tarde,

    A partir do SQL Server 2008 você pode utilizar Grouping Sets mais ou menos como segue:

    SELECT
        Id_Produto,
        Qtde,
        PrecoUnitario,
        SUM(Qtde * PrecoUnitario) as [Total 01]
    FROM TabelaVendas
    GROUP BY GROUPING SETS ((Id_Produto, Qtde, PrecoUnitario), ())

    Espero que seja útil.


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

    quinta-feira, 21 de fevereiro de 2013 20:57
  • Wellington,

    A solução do GAPIMEX é muito mais elegante que a minha, mas apenas para o SQL Server 2008.

    Quanto a minha solução: É utilizado um recurso chamado cube (Que é quase uma versão anterior e piorada do Grouping Sets), jogado seu resultado como uma sub-query e filtrado por uma logica (Where externo)


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

    sexta-feira, 22 de fevereiro de 2013 11:29
    Moderador
  • Gapimex, muito obrigado meu amigo, funcionou perfeitamente, aproveitei o GROUP BY SETS e o  ISNULL(CAST(a.Id_Produto AS VARCHAR(100)), do Fabrizzio.

    Ficou muito bom mesmo!!!

    Fabrizzio em relação a performance, é melhor utilizar a opção do Gapimex?

    Por favor, poderia me explicar o que esta acontecendo nesse pedaço de código? > ISNULL(CAST(a.Id_Produto AS VARCHAR(100)), 'Total geral') As Id_Produto,

    Muito obrigado a todos


    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 22 de fevereiro de 2013 12:45
  • Willington,

    O Grouping Sets é melhor que o meu, mas a minha solução pode ser executada em ambientes 2k e 2k5, enfim, tudo depende de seu cenario, agora se for 2k8 ou superior, utilize a do Gapimex.

    Nesta parte do codigo eu só estou setando para escrever "Total geral" aonde estiver nulo, sem isso voce tera todas as primeiras colunas nulas com o somatorio no final, porem, como Id_Produto é um inteiro ao tentar colcoar este texto no ISNULL ele ~tenta fazer a conversão de "TOtal geral" para inteiro, o que obviamente da erro então é necessario fazer a conversão da coluna Id_Produto para texto (Ainda que contendo apenas caracteres numericos)

    CAST -> Conversão de dados

    AS VARCHAR(100) -> Para um texto de 100 posições variaveis

    ISNULL -> Se o primeiro valor passado for nulo, coloque o segundo

    Para ajudar os outros usuarios do forum, marque como "resposta" todas as respostas que te ajudaram a chegar na solução.


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

    sexta-feira, 22 de fevereiro de 2013 12:49
    Moderador
  • Ah sim entendi Fabrizzio, Muito obrigado pelas dicas

    Abração


    Wellinghton Pimentel Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 22 de fevereiro de 2013 13:07