none
SubConsulta RRS feed

  • Pergunta

  • Boa tarde!

    Estou precisando montar uma consulta  onde liste o nome do grupo , a quantidade total de cada grupo e a quantidade total  que seria a soma de todos os grupo. Seria basicamente assim:

    Grupo | quantidade do grupo | total Geral

    A10     |   3                              | 100

    A30     |50                               |100

    A40     | 70                              |100

    A89    |  5                                 | 100

    Minha dificuldade esta sendo em colocar o total geral em uma coluna. Estou tentando com uma subconsulta porém nao está funcionando. Quando incluo a subconsulta fica dando a mensagem que preciso incluir campos no group by

    Poderiam me ajuda?

    SELECT GRUPO, COUNT(*) AS TOTAL_GRUPO,
    	  (SELECT COUNT(*)  FROM vw_frota_media_ch_v X
    			  WHERE X.CH_ID = V.CH_ID ) AS TOTAL_GERAL
    FROM vw_frota_media_ch_v V
    WHERE CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) >= '20170401' 
    AND   CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) <= '20170430'
    GROUP BY GRUPO

    Ou teria outra forma de montar essa consulta?

    quarta-feira, 5 de julho de 2017 18:28

Respostas

  • Boa tarde,

    Carine, experimente fazer uns testes dessa forma:

    SELECT 
        GRUPO, 
        COUNT(*) AS TOTAL_GRUPO,
        SUM(COUNT(*)) OVER() AS TOTAL_GERAL
    FROM vw_frota_media_ch_v V
    WHERE CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) >= '20170401' 
    AND   CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) <= '20170430'
    GROUP BY GRUPO

    Espero que ajude


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

    • Marcado como Resposta carine.couto quarta-feira, 5 de julho de 2017 19:28
    quarta-feira, 5 de julho de 2017 19:21
  • Essa query te atende ??

    SELECT  GRUPO ,
    		Mes = MONTH(CH_DATA_ABERTURA),
            QuantidadeGrupo = COUNT() OVER( PARTITION BY GRUPO),
    		TotalGeral = COUNT() OVER()
    FROM    vw_frota_media_ch_v V
    WHERE   CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) >= '20170401'
            AND CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) <= '20170430'
    GROUP BY GRUPO,Mes;



    Wesley Neves - Brasilia-DF


    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    Wesley Neves



    Wesley Neves

    • Marcado como Resposta carine.couto quarta-feira, 5 de julho de 2017 19:28
    quarta-feira, 5 de julho de 2017 19:18

Todas as Respostas

  • Carine,

    O Total Geral seria a soma entre Total_Grupo + Total_Geral?

    Será que este exemplo pode te ajudar?

    Create Table Teste
    (Codigo Char(3),
     Quantidade Int,
     Total Int)
    Go
    
    Insert Into Teste
    Values ('A10', 3, 100),
           ('A30', 50, 100),
    	   ('A40', 70, 100),
    	   ('A89', 5, 100)
    Go
    
    Insert Into Teste
    Values ('A10', 3, 100),
           ('A30', 50, 100),
    	   ('A40', 70, 100),
    	   ('A89', 5, 100)
    Go
    
    Insert Into Teste
    Values ('A10', 6, 120),
           ('A30', 5, 130),
    	   ('A40', 7, 150),
    	   ('A89', 15, 180)
    Go
    
    -- Utilizando SubQuery --
    Select Codigo, 
           Count(Quantidade) as Quantidade,
    	   Total,
    	   Total_Geral = (Count(Quantidade) + Sum(Total))
    From Teste
    Group By Codigo, Total
    Go


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quarta-feira, 5 de julho de 2017 18:41
  • O total geral seria a soma dos grupos.

    O usuário vai digitar o período e a consulta trará a quantidade de cada grupo e total geral a soma  dos grupos.

    Acho que esse exemplo ta melhor.

    Grupo | quantidade do grupo | total Geral

    A10     |   3                              | 108

    A30     |30                               |108

    A40     | 70                              |108

    A89    |  5                                 | 108

    Se somarmos os valores 3 + 30 +70+5 = 108

    esse seria o total geral.

    quarta-feira, 5 de julho de 2017 18:50
  • Analise  o uso da função OVER()

    segue um exemplo

    DECLARE @Grupos TABLE
    (
     nome CHAR(3) ,
     quantidade INT
    )
    INSERT INTO @Grupos
            ( nome, quantidade )
    VALUES  
    ( 'A10',3 ),
    ( 'A30',50 ),
    ( 'A40',70 ),
    ( 'A89',5 ),
    ( 'A10',3 )
    
    SELECT G.nome ,
            G.quantidade,
    		QuantidadeGrupos = COUNT(*) OVER(),
    		TotalGrupos = sum(G.quantidade)  OVER() FROM @Grupos AS G


    Wesley Neves - Brasilia-DF


    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    Wesley Neves



    Wesley Neves

    quarta-feira, 5 de julho de 2017 18:52
  • Carine,

    Mas neste caso, seria justamente uma simples SubQuery fazendo o Sum de toda coluna?

    Será que isso ajudaria:

    Select Codigo, 
           Count(Quantidade) as Quantidade,
    	   Total_Geral = (Select Sum(Quantidade) From Teste)
    From Teste
    Group By Codigo, Total
    Go


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 5 de julho de 2017 18:54
  • pessoal,

    eu nao tenho o campo quantidade , eu consigo ele atraves do count da tabela...

    tentar explicar melhor ...

    minha tabela é formada pelo seguintes campos:

    (É uma tabela que contem todos os chamados que sao abertos no setor de frota, e eles querem saber a quantidade de chamados abertos pelos grupos e o total geral aberto no mes.

    Estrutura da tabela

    Grupo  | chamado | dias 

    A10      |  001       | 3 

    A20     | 002         | 7

    A30   | 003           |8

    A30   | 003           |4

    Preciso que a query me mostre da seguinte forma:

    Grupo | quantidade total grupo | total Geral do mes

    A10     |   3                                  | 100

    A30     |50                                   |100

    A40     | 70                                  |100

    A89    |  5                                   |100

    Com essa query abaixo consigo trazer o quantitativo de cada grupo                        

    SELECT GRUPO, COUNT(*) AS TOTAL_GRUPO,
    	
    FROM vw_frota_media_ch_v V
    WHERE CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) >= '20170401' 
    AND   CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) <= '20170430'
    GROUP BY GRUPO

    Grupo | quantidade total grupo

    A10     |   3                             

    A30     |50                                

    A40     | 70                             

    A89    |  5                                 

    Porém preciso que ele liste em uma coluna o total geral, ficando assim:

    Grupo | quantidade total grupo | total Geral do mes

    A10     |   3                                  | 100

    A30     |50                                   |100

    A40     | 70                                  |100

    A89    |  5                                   |100



    quarta-feira, 5 de julho de 2017 19:09
  • Essa query te atende ??

    SELECT  GRUPO ,
    		Mes = MONTH(CH_DATA_ABERTURA),
            QuantidadeGrupo = COUNT() OVER( PARTITION BY GRUPO),
    		TotalGeral = COUNT() OVER()
    FROM    vw_frota_media_ch_v V
    WHERE   CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) >= '20170401'
            AND CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) <= '20170430'
    GROUP BY GRUPO,Mes;



    Wesley Neves - Brasilia-DF


    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"


    Wesley Neves



    Wesley Neves

    • Marcado como Resposta carine.couto quarta-feira, 5 de julho de 2017 19:28
    quarta-feira, 5 de julho de 2017 19:18
  • Boa tarde,

    Carine, experimente fazer uns testes dessa forma:

    SELECT 
        GRUPO, 
        COUNT(*) AS TOTAL_GRUPO,
        SUM(COUNT(*)) OVER() AS TOTAL_GERAL
    FROM vw_frota_media_ch_v V
    WHERE CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) >= '20170401' 
    AND   CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) <= '20170430'
    GROUP BY GRUPO

    Espero que ajude


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

    • Marcado como Resposta carine.couto quarta-feira, 5 de julho de 2017 19:28
    quarta-feira, 5 de julho de 2017 19:21
  • Obrigada pela atenção.

    Funcionou perfeitamente.

    quarta-feira, 5 de julho de 2017 19:28
  • Boa tarde,

    Carine, experimente fazer uns testes dessa forma:

    SELECT 
        GRUPO, 
        COUNT(*) AS TOTAL_GRUPO,
        SUM(COUNT(*)) OVER() AS TOTAL_GERAL
    FROM vw_frota_media_ch_v V
    WHERE CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) >= '20170401' 
    AND   CONVERT(VARCHAR(8), CH_DATA_ABERTURA, 112) <= '20170430'
    GROUP BY GRUPO

    Espero que ajude


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

    Gapimex,

    Legal, legal, você sugeriu o uso da função OVER() interessante pois para este tipo de solução ela acaba sendo mais indicada e apresenta uma possibilidade de performance superior ao uso de subquery.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 7 de julho de 2017 00:13