none
Tabela Cruzada RRS feed

  • Pergunta

  • Bom dia carissímos,

    Depois de comprar dois livros de SQL e de pesquisar na net decidi que seria bastante mais fácil se tivesse uma ajuda do pessoal deste fórum.
    O que eu pretendo é criar uma view em SQL Server 2005 com as seguintes caracteristicas:

                 Total de Impressões      Nov 2008
    Hugo             12                              12
    Joaquim         13                             14
    Manel            20                             20


    Tenho uma view chamada view_extrato_global que tem os campos Mês, Nome, Total de Impressões;
    Pelo que li, é necessário criar uma tabela cruzada com os campos name e total de impressões e depois fazer contagem/sumatorio do numero de impressões por mês.


    Cumprimentos,
    Hugo Pereira
    sexta-feira, 28 de novembro de 2008 11:34

Todas as Respostas

  •  

    Flashe, não sei se entendi direito sua necessidade, mas vamos lá. Veja se é mais ou menos isso.

    Suponha que a tabela criada abaixo é sua view.  Segui os campos que você citou.

    Se for isso mesmo, você não precisaria de outra tabela, basta fazer um group by:

     

    Code Snippet

    select nome, sum(qtde) as qtde, mes from teste group by nome, mes

     

     

    -- tabela de exemplo

    create table teste (nome varchar(50), qtde int, mes int)
    go

     

    -- dados para teste

    insert into teste values('Ivan', 3, 10)
    insert into teste values('Ivan', 5, 10)
    insert into teste values('Ivan', 4, 11)
    insert into teste values('Jose', 2, 10)
    insert into teste values('Jose', 3, 10)
    insert into teste values('Jose', 1, 11)
    insert into teste values('Carlos', 2, 10)
    insert into teste values('Carlos', 8, 10)
    insert into teste values('Carlos', 2, 11)

     

     

     

    É isso?

     

    Abx.

    sexta-feira, 28 de novembro de 2008 12:09
  • Não é bem isso, vou tentar explicar melhor...

    Tenho uma tabela com os campos

    Name     | Total de Impressões |      Mês     |
    Hugo                  12                   Novembro
    Joaquim              12                   Novembro
    Claudio               20                   Dezembro
    Hugo                   12                  Novembro



    o resultado da view tem de ser:

    Total de Impressões Novembro Dezembro
    Hugo              12                      12              0
    Joaquim          12                      12              0
    Claudio            20                      0              20


    Basicamente eu tenho um csv que envia os logs para o sql, depois tenho o campo Mês que lê a data de cada registo e coloca o mês do registo, assim sendo na minha tabela aparecem varios registos com o mesmo nome. É necessario que a view faça um group by do nome.
    sexta-feira, 28 de novembro de 2008 12:43
  •  

    Você precisa de uma linha por nome, e a soma por meses apresentadas em colunas? É isso?

     

    abx.

    sexta-feira, 28 de novembro de 2008 15:46
  • Nem mais amigo. Desde ja um muito obrigado pelo interesse em ajudar-me.

     

    cumprimentos,

    Hugo Pereira

    sexta-feira, 28 de novembro de 2008 15:49
  • Bem não é a solução mais rapida mas resolve

     

    Utilize colunas virtuais e subselects

     

    exemplo

     

    Select

      Janeiro = (select  count(*) from tabela  t2 where t2.cod = t1.cod and mes = 'Janeiro')

    , Fevereiro = (select  count(*) from tabela  t2 where t2.cod = t1.cod ane mes = 'Fevereiro')

     

    from  tabela t1

     

     

     

    Ou você pode criar uma tabela de Mês e cruzar usando um outer join e contabilizar com Group by

     

    sexta-feira, 28 de novembro de 2008 20:12
  • Boa Noite,

     

    Dê uma olhadinha no script abaixo:

    Code Snippet

     

    CREATE TABLE tbl (Nome VARCHAR(20), TotalImpr INT, Mes VARCHAR(20))

     

    INSERT INTO tbl VALUES ('Hugo',12,'Dezembro')

    INSERT INTO tbl VALUES ('Joaquim',12,'Novembro')

    INSERT INTO tbl VALUES ('Claudio',20,'Dezembro')

    INSERT INTO tbl VALUES ('Hugo',12,'Novembro')

     

    SELECT Nome, ISNULL([Novembro],0) AS Nov, ISNULL([Dezembro],0) AS Dez,

    ISNULL([Novembro],0) + ISNULL([Dezembro],0) As TotalImpressoes

    FROM

    (SELECT Nome, TotalImpr, Mes

    FROM TBL) AS ST

    PIVOT

    (

    SUM(TotalImpr)

    FOR Mes IN ([Novembro],[Dezembro])

    ) AS PT

     

     

    Esse comando de PIVOT é muito interessante e é novidade no 2005. Em todo caso, ele possui um ponto fraco. Observe que você teve que informar previamente os meses de novembro e dezembro. Se aparecesse algo no mês de outubro, sua consulta não iria contemplá-lo. Seria necessário alterar suas consultas. Infelizmente o comando de PIVOT não é dinâmico. Se desejar torná-lo dinâmico, dê uma olhadinha no artigo que postei no meu blog.

     

    Transformando Linhas em Colunas com o SQL Server 2005

    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!178.entry

     

    [ ]s,

     

    Gustavo

    sexta-feira, 28 de novembro de 2008 22:28