none
Agrupar por Idades diferentes usando IIF... RRS feed

  • Pergunta

  • Olá a todos... Estou com o seguinte problema:
    Tenho uma consulta SQL que me retorna algumas linhas como mostra a imagem:

     

    O problema é que eu tenho que exibir agrupado em uma faixa de idade tal qual esse exemplo:

    Sei que no SQL Server tem o "CASE", e no Access? Estava lendo sobre o "IIF" mas não consegui usar no meu caso...

    Seria algo como:

    SE a IDADE estiver entre 0 e 1 ano, mostre os campos QTDE_GUIA, COBRADO E LIBERADO
    SE a IDADE estiver entre 2 e 5 anos, mostre os campos QTDE_GUIA, COBRADO E LIBERADO
    SE a IDADE estiver entre 6 e 10 anos, mostre os campos QTDE_GUIA, COBRADO E LIBERADO

    e assim, sucessivamente...

    Alguém pode me ajudar?

    O meu muito obrigado por enquanto!

    quinta-feira, 27 de maio de 2010 14:31

Respostas

  • Uso IIF em VB.Net não sei se é o ideal, mas no seu caso você poderia colocar um iif dentro de outro:

     

    A estrutura do IIF é a seguinte:

     

    iif(condição,resposta se verdadeiro,resposta se falso)

    Colocando um outro iif na parte reservada a resposta se falso o resultado é um SENÃO SE, veja:

    iif(idade <= 1, MostraCampos1, iif(idade <=5, MostraCampos2,iif(idade <= 10,MostraCampos3,Mostracampos4)))

    Eu fiz apenas uma parte, mas neste caso poderiamos traduzir da seguinte forma:

    SE IDADE FOR MENOR OU IGUAL A 1 ENTÃO MOSTRA CAMPOS 1 SENÃO SE IDADE FOR MENOR OU IGUAL A 5 ENTÃO MOSTRA CAMPOS 2 SENÃO SE IDADE FOR MENOR OU IGUAL A 10 MOSTRA CAMPOS 3 SENÃO MOSTRACAMPOS4.


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP
    quinta-feira, 27 de maio de 2010 21:43
  • Gilberto,

    Você pode fazer isso com um sub-select facilmente... Veja só (para esse caso, só fiz com três faixas, mas, é só adaptar para as faixas que você tem seguindo a mesma lógica)...

    SELECT
       FAIXA_IDADE,
       COUNT(QUANT_GUIAS) AS COUNT_QUANT_GUIAS,
       SUM(COBRADO) AS SUM_COBRADO,
       SUM(LIBERADO) AS SUM_LIBERADO
    FROM (
       SELECT
          IIF(IDADE BETWEEN 0 AND 1, 'Até 1 ano', IIF(IDADE BETWEEN 2 AND 5, '2 a 5', 'Maior que 5')) AS FAIXA_IDADE,
          QUANT_GUIAS,
          COBRADO,
          LIBERADO
       FROM TABLE1)
    GROUP BY FAIXA_IDADE


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sexta-feira, 28 de maio de 2010 21:55
    Moderador

Todas as Respostas

  • Uso IIF em VB.Net não sei se é o ideal, mas no seu caso você poderia colocar um iif dentro de outro:

     

    A estrutura do IIF é a seguinte:

     

    iif(condição,resposta se verdadeiro,resposta se falso)

    Colocando um outro iif na parte reservada a resposta se falso o resultado é um SENÃO SE, veja:

    iif(idade <= 1, MostraCampos1, iif(idade <=5, MostraCampos2,iif(idade <= 10,MostraCampos3,Mostracampos4)))

    Eu fiz apenas uma parte, mas neste caso poderiamos traduzir da seguinte forma:

    SE IDADE FOR MENOR OU IGUAL A 1 ENTÃO MOSTRA CAMPOS 1 SENÃO SE IDADE FOR MENOR OU IGUAL A 5 ENTÃO MOSTRA CAMPOS 2 SENÃO SE IDADE FOR MENOR OU IGUAL A 10 MOSTRA CAMPOS 3 SENÃO MOSTRACAMPOS4.


    Se o post foi útil marque como resposta. - Advanced Web Application - MCP
    quinta-feira, 27 de maio de 2010 21:43
  • Opa pessoal, obrigado por responder!

    Seguinte, é quase isso que vcs me passaram... Mas dessa forma, eu só consigo os resultados na horizontal... Na verdade eu preciso da instrução SQL que me traga às somas dos campos em cada linha... Se eu tiver 3 períodos de Idades na minha Query, eu quero que ela me retorne 3 linhas de uma só vez, mas somando os campos respectivos de cada período... Ficaria algo como:

    1º Linha = (IDADE BETWEEN 0 AND 1)      COUNT(QUANT_GUIAS) || SUM(COBRADO) || SUM(LIBERADO)
    2º Linha = (IDADE BETWEEN 2 AND 5)      COUNT(QUANT_GUIAS) || SUM(COBRADO) || SUM(LIBERADO)
    3º Linha = (IDADE BETWEEN 6 AND 10)    COUNT(QUANT_GUIAS) || SUM(COBRADO) || SUM(LIBERADO)
    4º Linha = (IDADE BETWEEN 11 AND 20)  COUNT(QUANT_GUIAS) || SUM(COBRADO) || SUM(LIBERADO)

    Não precisa mostrar os campos de idade porque se não, não vai agrupar...
    O resultado que eu quero é exatamente como está na segunda imagem do primeiro post, mas sem os "textos" contendo o intervalo de idade... Eu preciso só dos campos QUANT_GUIAS| COBRADO | GLOSADO
     
    Obrigado pela ajuda!

    sexta-feira, 28 de maio de 2010 12:21
  • Olá, Gilberto

    Você pode utlizar ADO.NET?

    Se sim poderia criar programaticamente uma DataTable com DataColumns e fazer um foreach na sua consulta e popular da forma que você gostaria.


    Américo Arvani
    MCP Frw web 2.0
    Se ajudou , marque como resposta.
    http://americoarvani.blogspot.com
    sexta-feira, 28 de maio de 2010 17:05
  • Opá Américo... Posso sim... Na verdade, essa consulta eu vou "jogar" num GridView...

    Se você puder postar um exempo de como montar o Grid e o For Each com o  bind dos dados, eu agradeceria muito!

    Abs e muito obrigado!

    sexta-feira, 28 de maio de 2010 19:17
  • Gilberto,

    Você pode fazer isso com um sub-select facilmente... Veja só (para esse caso, só fiz com três faixas, mas, é só adaptar para as faixas que você tem seguindo a mesma lógica)...

    SELECT
       FAIXA_IDADE,
       COUNT(QUANT_GUIAS) AS COUNT_QUANT_GUIAS,
       SUM(COBRADO) AS SUM_COBRADO,
       SUM(LIBERADO) AS SUM_LIBERADO
    FROM (
       SELECT
          IIF(IDADE BETWEEN 0 AND 1, 'Até 1 ano', IIF(IDADE BETWEEN 2 AND 5, '2 a 5', 'Maior que 5')) AS FAIXA_IDADE,
          QUANT_GUIAS,
          COBRADO,
          LIBERADO
       FROM TABLE1)
    GROUP BY FAIXA_IDADE


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    sexta-feira, 28 de maio de 2010 21:55
    Moderador
  • André, é, sem tirar em nem por, exatamente isso que eu queria...

    Agora ficou perfeito...

     

    SELECT IDADE_PACIENTE, COUNT(GUIA) AS QTDE_GUIA, SUM(VALOR_TOTAL) AS TOTAL
    
    FROM (SELECT IIF(IDADE_PACIENTE BETWEEN 0 AND 1, 'Até 1 Ano', 
        IIF(IDADE_PACIENTE BETWEEN 2 AND 5, '2 a 5 Anos', 
    	   IIF(IDADE_PACIENTE BETWEEN 6 AND 10, '6 a 10 Anos',
    	   IIF(IDADE_PACIENTE BETWEEN 11 AND 20, '11 a 20 Anos',
    	   IIF(IDADE_PACIENTE BETWEEN 21 AND 50, '21 a 50 Anos',
    	   IIF(IDADE_PACIENTE BETWEEN 51 AND 60, '51 a 60 Anos',
    	   IIF(IDADE_PACIENTE BETWEEN 61 AND 65, '61 a 65 Anos', 'Acima de 66 Anos'))))))) 
    			 
    AS IDADE_PACIENTE, GUIA, VALOR_TOTAL FROM PREANALISE) GROUP BY IDADE_PACIENTE

     

    @Marcus, agora, olhando o exemplo do André foi que eu entendi o que você queria dizer

    Muito obrigado aos dois pela ajuda!

    Abs e bom fds!

    sábado, 29 de maio de 2010 03:20