none
Dúvida em Query com CASE RRS feed

  • Pergunta

  • Boas..
    Tenho 2 tabelas..

    Utentes
    NProcesso
    Nome
    ...

    Agregado Familiar
    CodAgregado
    Nprocesso
    Nome
    ...

    Queria que me mostra-se quantos Agregados têm 1 elementos, quantos têm 2, etc..
    Tentei fazer isto, mas não funciona..
        SELECT
            CASE
            WHEN (SELECT count(NElementoAG) FROM Utentes LEFT OUTER JOIN Agregado_Familiar
                    ON Utentes.NProcesso = Agregado_Familiar.NProcesso) = 1 then '1'
            WHEN (SELECT count(NElementoAG)FROM Utentes LEFT OUTER JOIN Agregado_Familiar
                    ON Utentes.NProcesso = Agregado_Familiar.NProcesso) = 2 then '2'
        ELSE 'Outros'
        END AS Nelementos
        FROM Utentes
            LEFT OUTER JOIN Agregado_Familiar
            ON Utentes.NProcesso = Agregado_Familiar.NProcesso
        GROUP BY
        CASE
            WHEN (SELECT count(NElementoAG) FROM Utentes LEFT OUTER JOIN Agregado_Familiar
                    ON Utentes.NProcesso = Agregado_Familiar.NProcesso) = 1 then '1'
            WHEN (SELECT count(NElementoAG)FROM Utentes LEFT OUTER JOIN Agregado_Familiar
                    ON Utentes.NProcesso = Agregado_Familiar.NProcesso) = 2 then '2'
            ELSE 'Outros'
        END




    quarta-feira, 16 de janeiro de 2008 12:08

Respostas

  •  

    Olá Vitor,

     

    Agora sim entendi (finalmente!! hehe, acho que estou um pouco cansado hoje, hehe).

     

    Veja, seguindo a mesmo idéia de um dos meus posts anteriores, criei o seguinte exemplo, apenas use a parte do select

     

    Code Block

    create table #Utentes (Nprocesso int identity (1,1), nome char (1))

    insert into #Utentes (nome) values ('a')

    insert into #Utentes (nome) values ('b')

    insert into #Utentes (nome) values ('c')

     

    create table #Agregado (Cod int identity (1,1), Nprocesso int, Nome varchar (10))

    insert into #Agregado (Nprocesso, Nome) values(1, 'asas')

    insert into #Agregado (Nprocesso, Nome) values(2, 'asdasd')

    insert into #Agregado (Nprocesso, Nome) values(2, 'asdasd')

    insert into #Agregado (Nprocesso, Nome) values(1, 'asda')

    insert into #Agregado (Nprocesso, Nome) values(3, 'asdasd')

     

    -- esse é o select correto

    select quant, count(*) from (

    select U.Nprocesso, count(*) quant

    from #Utentes U

    inner join #Agregado A on U.Nprocesso = A.Nprocesso

    group by U.Nprocesso

    ) tbl

    group by quant

     

    drop table #Utentes

    drop table #Agregado

     

     

     

     

    Veja se funciona, qualquer coisa retorne.

     

     

    Abraço!!

    quarta-feira, 16 de janeiro de 2008 16:05
  •  

    Legal,

     

     

    Qualquer coisa retorne.

     

     

     

     

    Abraço

    quinta-feira, 17 de janeiro de 2008 13:43

Todas as Respostas

  •  

    Olá Vitor,

     

     

    Veja se assim resolve seu problema:

     

    Code Block

    SELECT NProcesso, CASE Numero WHEN 1 THEN '1' WHEN 2 THEN '2' ELSE 'Outros' END AS Nelementos

    FROM (

    SELECT NProcesso, count(NElementoAG) Numero

    FROM Utentes

    INNER JOIN Agregado_Familiar

    ON Utentes.NProcesso = Agregado_Familiar.NProcesso

    GROUP BY NProcesso

    ) AS Tbl

     

     

     

    Simplesmente usei uma consulta sobre consulta.

     

     

    Abraço!!

     

    quarta-feira, 16 de janeiro de 2008 12:26
  • Boas Alexandre...
    Ele assim mostra-me o número de agregados por utente..
    O que eu quero é que ele me conte o número de utente que têm x agregados

    Exemplo
    N.º Elementos
    1              100
    2               52
    3              100
    4               111
    5                1
    Mais 6         5

    Algo assim do género
    quarta-feira, 16 de janeiro de 2008 12:35
  •  

    Você um relacionamento 1-N. Desta forma só pode contar quantos itens existem para cada um. Você está tentando fazer o contrário, que sempre dará um.

     

    Isso que você quer somente teria lógica caso fosse um relacionamento N-N.

     

     

     

     

    Abraço

    quarta-feira, 16 de janeiro de 2008 12:57
  • Não é possivel com um case num sp?
    quarta-feira, 16 de janeiro de 2008 12:58
  •  

    Certo, agora acho entendi, hehe.

     

     

    Teste assim:

     

    Code Block

    SELECT CodAgregado, CASE Numero WHEN 1 THEN '1' WHEN 2 THEN '2' ELSE 'Outros' END AS Nelementos

    FROM (

    SELECT CodAgregado, count(NElementoAG) Numero

    FROM Utentes

    INNER JOIN Agregado_Familiar

    ON Utentes.NProcesso = Agregado_Familiar.NProcesso

    GROUP BY CodAgregado

    ) AS Tbl

     

     

     

    Abraço!!

     

    quarta-feira, 16 de janeiro de 2008 13:12
  • Obrigado pela ajuda, mas acho que ainda não me expliquei correctamente..

    Na tabela Agregado Familiar, guardo os dados da familia do Utente, em que a chave é o campo NProcesso..

    O que eu preciso saber é quantas familias, têm 1 pessoas, quantas têm 2 pessoas e por aí adiante...
    quarta-feira, 16 de janeiro de 2008 14:05
  • Vitor,

     

    Seria então o caso de você fazer um agrupamento de valor e realizar a conta.

     

    Veja se consegui entender o que você esta tentando fazer, este é um pequeno exemplo:

     

    Code Block

    Declare @Familia Table

    (Codigo Int Identity(1,1),

    Descricao VarChar(10))

     

    Insert Into @Familia Values('Silva')

    Insert Into @Familia Values('Soares')

    Insert Into @Familia Values('Galvão')

    Insert Into @Familia Values('Almeida')

     

    Declare @Familiares Table

    (Codigo Int Identity(1,1),

    CodFamilia Int)

     

    Insert Into @Familiares Values(1)

    Insert Into @Familiares Values(1)

    Insert Into @Familiares Values(3)

    Insert Into @Familiares Values(4)

     

    Select F.Descricao As Familia,

    Count(FM.Codigo) As 'Qtde Parentes' From @Familia F Inner Join @Familiares FM

    On F.Codigo = FM.CodFamilia

    Group By F.Descricao

     

     

    quarta-feira, 16 de janeiro de 2008 14:40
  • Vitor, se eu entendi, você tem uma tabela que guarda o Utente e na outra vc guarda os dependentes?

     

    Você quer saber quantos dependentes tem cada Utente, é isso?

     

    Se for isso, posso te fazer um exemplo sem CASE, vc pode agrupar contando.

     

    Code Block

    Select cod_utente, count(cod_utente), From utente

    inner join agregado_familiar on a.cod_utente = b.cod_utente

    group by cod_utente

     

     

    Veja se funciona, se for o caso, fazemos algo diferente.

     

    Abraços,

    quarta-feira, 16 de janeiro de 2008 14:40
  • Vitor,

     

    Acho que agora eu entendi, veja abaixo este exemplo é muito parecido com o outro, mas o que mudou foi que utilizei o Case.

     

    Code Block

    Declare @Familia Table

    (Codigo Int Identity(1,1),

    Descricao VarChar(10))

     

    Insert Into @Familia Values('Silva')

    Insert Into @Familia Values('Soares')

    Insert Into @Familia Values('Galvão')

    Insert Into @Familia Values('Almeida')

     

    Declare @Familiares Table

    (Codigo Int Identity(1,1),

     CodFamilia Int)

     

    Insert Into @Familiares Values(1)

    Insert Into @Familiares Values(1)

    Insert Into @Familiares Values(3)

    Insert Into @Familiares Values(4)

     

    Select F.Descricao As Familia,

    Case Count(FM.Codigo)

       When 1 Then '1 parente'

       When 2 Then '2 parentes'

       When 3 Then '3 parentes'

       When 4 Then '4 parentes'

    Else

      'Familia Grande'

    End As 'Qtde Parentes' From @Familia F Inner Join @Familiares FM

                                            On F.Codigo = FM.CodFamilia

    Group By F.Descricao

     

     

     

    quarta-feira, 16 de janeiro de 2008 14:43
  • Eu não quero saber quantos dependentes tem cada utente, mas sim sabe quantos utentes tem 1 dependente, quantos tme 2 dependentes.

    Dados Utentes (Nprocesso,Nome)
    1, a
    2, b
    3, c

    Dados Agregado Familiar (Cod, Nprocesso, Nome)
    1, 1, asas
    2, 2, asdasd
    3, 2, asdasd
    4, 1, asda
    5, 3, asdasd

    Resultado prentendido
    Valor
    1   1
    (que representa o b por ter 1 dependente
    2   2(que representa o a e o b por terem 2 dependentes



    quarta-feira, 16 de janeiro de 2008 14:50
  • Tentei adaptar o seu código mas não consigo..

    SELECT    CASE COUNT(agregado_familiar.nprocesso)
                          WHEN 1 THEN '1 parente' WHEN 2 THEN '2 parentes' WHEN 3 THEN '3 parentes' WHEN 4 THEN '4 parentes' ELSE 'Familia Grande' END AS 'Qtde Parentes'
    FROM         dbo.Utentes INNER JOIN
                          dbo.Agregado_Familiar ON dbo.Utentes.NProcesso = dbo.Agregado_Familiar.NProcesso

    Não sei porque campo agrupar..Por que campo devo substituir o seu F.Descricao As Familia?


     Junior Galvão - MVP wrote:

    Vitor,

     

    Acho que agora eu entendi, veja abaixo este exemplo é muito parecido com o outro, mas o que mudou foi que utilizei o Case.

     

    Code Block

    Declare @Familia Table

    (Codigo Int Identity(1,1),

    Descricao VarChar(10))

     

    Insert Into @Familia Values('Silva')

    Insert Into @Familia Values('Soares')

    Insert Into @Familia Values('Galvão')

    Insert Into @Familia Values('Almeida')

     

    Declare @Familiares Table

    (Codigo Int Identity(1,1),

     CodFamilia Int)

     

    Insert Into @Familiares Values(1)

    Insert Into @Familiares Values(1)

    Insert Into @Familiares Values(3)

    Insert Into @Familiares Values(4)

     

    Select F.Descricao As Familia,

    Case Count(FM.Codigo)

       When 1 Then '1 parente'

       When 2 Then '2 parentes'

       When 3 Then '3 parentes'

       When 4 Then '4 parentes'

    Else

      'Familia Grande'

    End As 'Qtde Parentes' From @Familia F Inner Join @Familiares FM

                                            On F.Codigo = FM.CodFamilia

    Group By F.Descricao

     

     

     

    quarta-feira, 16 de janeiro de 2008 15:19
  •  

    Olá Vitor,

     

    Agora sim entendi (finalmente!! hehe, acho que estou um pouco cansado hoje, hehe).

     

    Veja, seguindo a mesmo idéia de um dos meus posts anteriores, criei o seguinte exemplo, apenas use a parte do select

     

    Code Block

    create table #Utentes (Nprocesso int identity (1,1), nome char (1))

    insert into #Utentes (nome) values ('a')

    insert into #Utentes (nome) values ('b')

    insert into #Utentes (nome) values ('c')

     

    create table #Agregado (Cod int identity (1,1), Nprocesso int, Nome varchar (10))

    insert into #Agregado (Nprocesso, Nome) values(1, 'asas')

    insert into #Agregado (Nprocesso, Nome) values(2, 'asdasd')

    insert into #Agregado (Nprocesso, Nome) values(2, 'asdasd')

    insert into #Agregado (Nprocesso, Nome) values(1, 'asda')

    insert into #Agregado (Nprocesso, Nome) values(3, 'asdasd')

     

    -- esse é o select correto

    select quant, count(*) from (

    select U.Nprocesso, count(*) quant

    from #Utentes U

    inner join #Agregado A on U.Nprocesso = A.Nprocesso

    group by U.Nprocesso

    ) tbl

    group by quant

     

    drop table #Utentes

    drop table #Agregado

     

     

     

     

    Veja se funciona, qualquer coisa retorne.

     

     

    Abraço!!

    quarta-feira, 16 de janeiro de 2008 16:05
  • Obrigadissimo

    Funcionou perfeitamente...

    Mais uma vez obrigado..
    quarta-feira, 16 de janeiro de 2008 16:11
  • Tenho mais um problemazito mas acho mais simples..

    Precisava adicionar mais uma tabela aquele join porque preciso comparar um dos campos
    Tentei assim
    SELECT     TOP (100) PERCENT tbl.quant, COUNT(*) AS Expr1
    FROM         (SELECT     dbo.Utentes.NProcesso, COUNT(*) AS quant
                           FROM          dbo.Agregado_Familiar LEFT OUTER JOIN
                                                  dbo.Utentes ON dbo.Utentes.NProcesso = dbo.Agregado_Familiar.NProcesso
                           GROUP BY dbo.Utentes.NProcesso) AS tbl INNER JOIN
                          dbo.Servicos_Prestados ON tbl.NProcesso = dbo.Servicos_Prestados.NProcesso
    GROUP BY tbl.quant
    ORDER BY tbl.quant

    Mas os valores que tinha inicialmente, aumentaram em vez de se manter
    quarta-feira, 16 de janeiro de 2008 17:11
  •  

    Vitor,

     

     

    Agora complicou. Qual informação exatamente você precisa da tabela de Serviço??

     

     

    Abraço

    quarta-feira, 16 de janeiro de 2008 18:07
  • Preciso dois campos...
    Fazer um Servicos.Data BETWEEN @DataInicial AND @DataFinal AND Servico.Servico = @Servico
    quinta-feira, 17 de janeiro de 2008 09:07
  •  

    Vamos ver entendi, você quer continuar tendo aquele mesmo SELECT de antes mas quer ainda aplicar um filtro pela tabela de serviços, certo??

     

    Tentei fazer algo parecido com o que disso, vamos ser se funciona.

     

     

    Code Block

    SELECT TOP (100) PERCENT

    tbl.quant, COUNT(tbl.NProcesso) AS Expr1

    FROM (

    SELECT dbo.Utentes.NProcesso, COUNT(*) AS quant

    FROM dbo.Agregado_Familiar

    LEFT OUTER JOIN dbo.Utentes ON dbo.Utentes.NProcesso = dbo.Agregado_Familiar.NProcesso

    GROUP BY dbo.Utentes.NProcesso

    ) AS tbl

    INNER JOIN

    (

    SELECT DISTINCT NProcesso FROM dbo.Servicos_Prestados

    WHERE dbo.Servicos_Prestados.Data BETWEEN @DataInicial AND @DataFinal

    AND dbo.Servicos_Prestados.Servico = @Servico

    ) Servicos ON tbl.NProcesso = Servicos.NProcesso

    GROUP BY tbl.quant

    ORDER BY tbl.quant

     

     

     

    Se não for isso, retorne explicando mais um pouco oque deseja.

     

     

    Abraço!!!

     

     

     

     

    quinta-feira, 17 de janeiro de 2008 12:53
  • Obrigado..
    Em principio está tudo bem..

    quinta-feira, 17 de janeiro de 2008 13:31
  •  

    Legal,

     

     

    Qualquer coisa retorne.

     

     

     

     

    Abraço

    quinta-feira, 17 de janeiro de 2008 13:43