Usuário com melhor resposta
Dúvida em Query com CASE

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
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 Blockcreate
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 (group
by quantdrop
table #Utentesdrop
table #AgregadoVeja se funciona, qualquer coisa retorne.
Abraço!!
-
Todas as Respostas
-
Olá Vitor,
Veja se assim resolve seu problema:
Code BlockSELECT
NProcesso, CASE Numero WHEN 1 THEN '1' WHEN 2 THEN '2' ELSE 'Outros' END AS NelementosFROM
(FROM Utentes
INNER JOIN Agregado_Familiar
ON Utentes.NProcesso = Agregado_Familiar.NProcesso
GROUP BY NProcesso
)
AS TblSimplesmente usei uma consulta sobre consulta.
Abraço!!
-
-
-
-
Certo, agora acho entendi, hehe.
Teste assim:
Code BlockSELECT
CodAgregado, CASE Numero WHEN 1 THEN '1' WHEN 2 THEN '2' ELSE 'Outros' END AS NelementosFROM
(SELECT
FROM
UtentesINNER
JOIN Agregado_FamiliarON
GROUP
BY CodAgregado)
AS TblAbraço!!
-
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... -
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 BlockDeclare
@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.CodFamiliaGroup
By F.Descricao -
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 BlockSelect 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,
-
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 BlockDeclare
@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.CodFamiliaGroup
By F.Descricao -
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 -
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 BlockDeclare @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
-
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 Blockcreate
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 (group
by quantdrop
table #Utentesdrop
table #AgregadoVeja se funciona, qualquer coisa retorne.
Abraço!!
-
-
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 -
-
-
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 BlockSELECT
TOP (100) PERCENTtbl
FROM
(GROUP
BY tbl.quantORDER
BY tbl.quantSe não for isso, retorne explicando mais um pouco oque deseja.
Abraço!!!
-
-