none
Sub Total e Total Geral Com Counts RRS feed

  • Pergunta

  • Tenho a Seguinte tabela:

    Regiao                    DescricaoIdentificacao            IdUsuario

    Metropolitana         Direta                                      5

    Metropolitana         Indireta                                   6

    Metropolitana         Direta                                      5

    Metropolitana         Indireta                                   6

    Interior                   Direta                                      5

    Interior                   Indireta                                   6

    Interior                   Direta                                      5

    Interior                   Indireta                                   6

    Metropolitana         Direta                                      7

    Interior                   Indireta                                   8

    Quero colocar quantos tipos de identificação e reincidencias de identificação (quando o mesmo usuario pede mais de uma vez um determinado tipo de identificação na mesma região onde pediu anteriormente) em cada região. Ficando assim:

    Regiao            IdDireta     IdIndireta       SubTotal    RIdDireta*      RIdIndireta**   SubTotal    TotalGeral

    Metropolitana  3               2                      5               1                    1                        2               7

    Interior            2               3                      5               1                    1                        2               7

    *Reincidência de Identificação Direta

    **Reincidência de Identificação Indireta


    sexta-feira, 16 de janeiro de 2015 16:27

Respostas

  • Jean,

    Entendi a sua fórmula, mas como disse antes, existem 10 linhas na tabela de origem e o resultado total é 14.

    Existem 5 linhas para a região Metropolitana e o total geral é 7. A mesma coisa para o Interior.

    Acho que você está somando 2 vezes um mesmo pedido em casos de reincidência, pois o mesmo é somado nos Subtotais 1 e 2.

    Acho que o correto seria considerar o Subtotal 1 como Total Geral, ou então não considerar as reincidências no Subtotal 1, sendo que nesse caso o IdDireta da região Metropolitana seria igual a 2 (usuário 5 e 7).


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

    sexta-feira, 16 de janeiro de 2015 18:57

Todas as Respostas

  • Jean,

    Isso que você esta querendo é conhecido como Pivot, onde as linhas viram colunas, veja se estes exemplos podem ajudar:

    declare @pessoas as table (id int, nome varchar(30))
    declare @telefones as table (idpessoa int, tel varchar(9))
    insert into @pessoas values(1,'Marcelo')
    insert into @pessoas values(2,'Camila')
    insert into @pessoas values(3,'Tricolor')
    
    insert into @telefones values(1,'123-1234')
    insert into @telefones values(1,'222-2222')
    insert into @telefones values(1,'333-3333')
    insert into @telefones values(2,'123-1234')
    insert into @telefones values(2,'4444-4234')
    insert into @telefones values(2,'1406')
    insert into @telefones values(3,'125487-12')
    
    ;with cte
    as
    (
    select id,nome,tel, row_number() over (partition by id,nome order by id,nome ) as contador from @pessoas a inner join @telefones b ON a.id = b.idpessoa
    )
    select * from 
    (select id,nome,tel,contador from cte ) d
        pivot (max(tel) for contador in ([1],[2],[3])) as pvt
    
    Create table #Exemplo (codigo int, nome varchar(10), idUsuario int)
    
    insert into #Exemplo (codigo, nome, idUsuario) Values (1,'jose', 12)
    
    insert into #Exemplo (codigo, nome, idUsuario) Values (2,'mario', 7)
    
    insert into #Exemplo (codigo, nome, idUsuario) Values (1,'jose', 14)
    
    insert into #Exemplo (codigo, nome, idUsuario) Values (2,'mario', 12)
    
    insert into #Exemplo (codigo, nome, idUsuario) Values (3,'celso', 7)
    
    insert into #Exemplo (codigo, nome, idUsuario) Values (4,'andre', 14)
    
    
    Select [jose],[mario],[celso],[andre] from #exemplo 
    
    Pivot (count(codigo) for nome in ([jose],[mario],[celso],[andre])) p
    
    -- CTE com Pivot --
    with consulta as (select codigo, nome from #Exemplo) 
    
    Select [jose],[mario],[celso],[andre] from Consulta 
    
    Pivot (count(codigo) for nome in ([jose],[mario],[celso],[andre])) p
    
    
    -- Trabalhando com funções de agregação no Pivot
    CREATE TABLE Sales (EmpId INT, Yr INT, Sales MONEY)
    
    INSERT Sales VALUES(1, 2005, 12000)
    
    INSERT Sales VALUES(1, 2006, 18000)
    
    INSERT Sales VALUES(1, 2007, 25000)
    
    INSERT Sales VALUES(2, 2005, 15000)
    
    INSERT Sales VALUES(2, 2006, 6000)
    
    INSERT Sales VALUES(3, 2006, 20000)
    
    INSERT Sales VALUES(3, 2007, 24000)
    
     
    
    SELECT [2005], [2006], [2007]
    
    FROM (SELECT Yr, Sales FROM Sales) AS s
    
    PIVOT (SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS p
    
    
    SELECT [2005], [2006], [2007], [2005] + [2006] + [2007] As Total
    
    FROM (SELECT Yr, Sales FROM Sales) AS s
    
    PIVOT (SUM(Sales) FOR Yr IN ([2005], [2006], [2007])) AS p
    
    



    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    sexta-feira, 16 de janeiro de 2015 17:06
  • Boa tarde,

    Jean, experimente mais ou menos dessa forma:

    with CTE_Count as
    (
        select
            Regiao,
            DescricaoIdentificacao,
            IdUsuario,
            COUNT(*) as Qtd
        from Tabela
        group by
            Regiao,
            DescricaoIdentificacao,
            IdUsuario
    )
    
    select 
        Regiao,
        SUM(case when DescricaoIdentificacao = 'Direta' then Qtd end) as IdDireta,
        SUM(case when DescricaoIdentificacao = 'indireta' then Qtd end) as IdIndireta,
        SUM(Qtd) as SubTotal,
        COUNT(case when DescricaoIdentificacao = 'Direta' and Qtd > 1 then 1 end) as RIdDireta,
        COUNT(case when DescricaoIdentificacao = 'indireta' and Qtd > 1 then 1 end) as RIdIndireta,
        COUNT(case when Qtd > 1 then 1 end) as RSubTotal,
        SUM(Qtd) + COUNT(case when Qtd > 1 then 1 end) as TotalGeral
    from CTE_Count
    group by
        Regiao

    Espero que ajude.


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

    sexta-feira, 16 de janeiro de 2015 17:08
  • Gapimex,

    Será que as claúsulas Compute ou Compute By também não seria aplicadas a este cenário?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    sexta-feira, 16 de janeiro de 2015 17:12
  • O resultado pode ficar assim também:

    Região                              Metropolitana

    IdDireta                            3

    IdIndireta                         2

    SubTotal                           5

    RIdDireta*                         1

    RIdIndireta**                    1

    SubTotal                           2

    TotalGeral                         7

    Região                              Interior

    IdDireta                            2

    IdIndireta                         3

    SubTotal                           5

    RIdDireta*                         1

    RIdIndireta**                     1

    SubTotal                           2

    TotalGeral                         7

    TotalDasRegioes               14

    *Reincidência de Identificação Direta

    **Reincidência de Identificação Indireta

    Não precisa do pivot não, sem o pivot fica até melhor.

    Obrigado.

     

    sexta-feira, 16 de janeiro de 2015 17:16
  • Oi, esqueci que também tem o total geral sobre as Regiões, ficando assim:

    Regiao            |IdDireta|IdIndireta| SubTotal|RIdDireta*| RIdIndireta**|SubTotal|TotalGeral|TotalRegioes

    Metropolitana | 3          |2              |5             | 1              |1                     |2            |7              |14

    Interior           | 2          |3              |5              | 1             |1                     |2            | 7             |14

    Pode ficar embaixo também:

    Regiao            |IdDireta|IdIndireta| SubTotal|RIdDireta*| RIdIndireta**|SubTotal|TotalGeral

    Metropolitana | 3          |2              |5             | 1              |1                     |2            |7            

    Interior           | 2          |3              |5              | 1             |1                     |2            | 7       

    Total Regioes  |            |                |                |                |                       |              |14

         

    Desde já agradeço.


    sexta-feira, 16 de janeiro de 2015 17:27
  • Junior,

    Eu a princípio não vi uma forma de aplica-las.

    Abs


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

    sexta-feira, 16 de janeiro de 2015 17:33
  • Nem se ficar na vertical? Assim:

    Região                              Metropolitana

    IdDireta                            3

    IdIndireta                         2

    SubTotal                           5

    RIdDireta*                         1

    RIdIndireta**                    1

    SubTotal                           2

    TotalGeral                         7

    Região                              Interior

    IdDireta                            2

    IdIndireta                         3

    SubTotal                           5

    RIdDireta*                         1

    RIdIndireta**                     1

    SubTotal                           2

    TotalGeral                         7

    TotalDasRegioes               14

    Obrigado.

    sexta-feira, 16 de janeiro de 2015 17:37
  • Jean,

    Sobre o resultado, acho que na vertical como você postou ficaria mais complicado.

    Sobre o Total das regiões e o Total Geral, estou achando o valor dessas colunas meio estranho, já que a tabela exemplo que você postou tem apenas 10 linhas, e o resultado ficaria 14 (7 + 7). Seria isso mesmo?

     


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

    sexta-feira, 16 de janeiro de 2015 17:47
  • A última que eu postei tem 17 linhas (com o geral sobre as regiões). O Total Geral é a soma dos IdDireta + IdIndireta + RIdDireta + RIdIndireta e o Total das Regiões é a soma do Total Geral da Metropolitana +  Total Geral da Interior
    sexta-feira, 16 de janeiro de 2015 17:58
  • Pelo que entendi a última que você postou contem o resultado.

    Eu estava me referindo a tabela de origem do resultado (primeiro post).

    O que estou achando estranho é somar as reincidências (RIdDireta e RIdIndireta), pois pelo que estou entendendo, as reincidências já estão inclusas nos pedidos.

    Considerando por exemplo os dados do primeiro post, existem 3 linhas com a combinação Metropolitada / Direta, e o resultado com essa formula seria 4 (3 + 1). Seria isso mesmo? Estou entendendo errado?


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


    • Editado gapimex sexta-feira, 16 de janeiro de 2015 18:15
    sexta-feira, 16 de janeiro de 2015 18:15
  • Gapimex,

    A sua dúvida também virou a minha, pois no primeiro post eu entendi algo relacionado com Pivot.


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

    sexta-feira, 16 de janeiro de 2015 18:26
  • Pelo 1º exemplo temos:

    Regiao                    DescricaoIdentificacao            IdUsuario

    Metropolitana         Direta                                      5

    Metropolitana         Indireta                                   6

    Metropolitana         Direta                                      5

    Metropolitana         Indireta                                   6

    Interior                   Direta                                      5

    Interior                   Indireta                                   6

    Interior                   Direta                                      5

    Interior                   Indireta                                   6

    Metropolitana         Direta                                      7

    Interior                   Indireta                                   8

    Então, o resultado ficaria assim:

    Região                              Metropolitana

    IdDireta                            3(Leva em consideração Mesma Região e DescIdentificacao)

    IdIndireta                         2(Leva em consideração Mesma Região e DescIdentificacao)

    SubTotal ¹                         5(IdDireta  + IdIndireta)

    RIdDireta*                         1 (Leva em consideração Mesma Região e DescIdentificacao e IdUsuario)

    RIdIndireta**                    1(Leva em consideração Mesma Região e DescIdentificacao e IdUsuario)

    SubTotal ²                          2(RIdDireta + RIdIndireta)

    TotalGeral¹                         7(SubTotal ¹ + SubTotal ² )

    Região                              Interior

    IdDireta                            2(Leva em consideração Mesma Região e DescIdentificacao)

    IdIndireta                         3(Leva em consideração Mesma Região e DescIdentificacao)

    SubTotal¹                           5(IdDireta + IdIndireta)

    RIdDireta*                         1(Leva em consideração Mesma Região e DescIdentificacao e IdUsuario)

    RIdIndireta**                     1(Leva em consideração Mesma Região e DescIdentificacao e IdUsuario)

    SubTotal²                           2(RIdDireta + RIdIndireta)

    TotalGeral²                         7(SubTotal¹   + SubTotal²)

    TotalDasRegioes               14(TotalGeral¹  + TotalGeral²)

    sexta-feira, 16 de janeiro de 2015 18:32
  • Jean,

    Entendi a sua fórmula, mas como disse antes, existem 10 linhas na tabela de origem e o resultado total é 14.

    Existem 5 linhas para a região Metropolitana e o total geral é 7. A mesma coisa para o Interior.

    Acho que você está somando 2 vezes um mesmo pedido em casos de reincidência, pois o mesmo é somado nos Subtotais 1 e 2.

    Acho que o correto seria considerar o Subtotal 1 como Total Geral, ou então não considerar as reincidências no Subtotal 1, sendo que nesse caso o IdDireta da região Metropolitana seria igual a 2 (usuário 5 e 7).


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

    sexta-feira, 16 de janeiro de 2015 18:57