Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ErgoProxi

[Resolvido] Select Com Count + Filtro por Nome

Recommended Posts

Gente...

Tenho uma Tabela Com os Seguintes Status

 

Pendente = Sim / Pendente = Não / Finalizado / Sim

Eu consigo Fazer o Somatório dos Count em Duas tabelas Distintas e Exibir em Uma.

 

 

Select planoacaodescarga.quem, 
DISTINC 
(Select sum (num) as Atrasada From (SELECT COUNT(Pendente) as num FROM  planoacao where  
planoacao.Pendente = 'Sim' AND Isnull (planoacao.Finalizado) 
union all 
SELECT COUNT(Pendente) as num FROM planoacaodescarga where  
planoacaodescarga.Pendente = 'Sim' AND Isnull (planoacaodescarga.Finalizado))) as Atrasada,

(Select sum (num) as No_Prazo From (SELECT COUNT(Pendente) as num FROM  planoacao where  
planoacao.Pendente = 'Não' and Isnull (planoacao.Finalizado) 
union all 
SELECT COUNT(Pendente) as num FROM planoacaodescarga where 
planoacaodescarga.Pendente = 'Não' and Isnull (planoacaodescarga.Finalizado))) as No_Prazo,

(Select sum (num) as Finalizado From (SELECT COUNT(Finalizado) as num FROM  planoacao
where planoacao.Finalizado = 'Sim'  union all 
SELECT COUNT(Finalizado) as num FROM planoacaodescarga where  
planoacaodescarga.Finalizado = 'Sim' )) as Finalizado FROM planoacaodescarga ,planoacao GROUP BY planoacaodescarga.quem

 

 

Porém, Preciso deste count por Pessoa Tipo

A expressão retorna o somatório a cada Nome diferente... Quero o Somatório de Cada um nome em específico.

 

Se eu não fui claro.. por favor... avisem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gente...

Tenho uma Tabela Com os Seguintes Status

 

Pendente = Sim / Pendente = Não / Finalizado / Sim

Eu consigo Fazer o Somatório dos Count em Duas tabelas Distintas e Exibir em Uma.

 

 

Select planoacaodescarga.quem, 
DISTINC 
(Select sum (num) as Atrasada From (SELECT COUNT(Pendente) as num FROM  planoacao where  
planoacao.Pendente = 'Sim' AND Isnull (planoacao.Finalizado) 
union all 
SELECT COUNT(Pendente) as num FROM planoacaodescarga where  
planoacaodescarga.Pendente = 'Sim' AND Isnull (planoacaodescarga.Finalizado))) as Atrasada,

(Select sum (num) as No_Prazo From (SELECT COUNT(Pendente) as num FROM  planoacao where  
planoacao.Pendente = 'Não' and Isnull (planoacao.Finalizado) 
union all 
SELECT COUNT(Pendente) as num FROM planoacaodescarga where 
planoacaodescarga.Pendente = 'Não' and Isnull (planoacaodescarga.Finalizado))) as No_Prazo,

(Select sum (num) as Finalizado From (SELECT COUNT(Finalizado) as num FROM  planoacao
where planoacao.Finalizado = 'Sim'  union all 
SELECT COUNT(Finalizado) as num FROM planoacaodescarga where  
planoacaodescarga.Finalizado = 'Sim' )) as Finalizado FROM planoacaodescarga ,planoacao GROUP BY planoacaodescarga.quem

 

 

Porém, Preciso deste count por Pessoa Tipo

A expressão retorna o somatório a cada Nome diferente... Quero o Somatório de Cada um nome em específico.

 

Se eu não fui claro.. por favor... avisem.

 

 

Tabela Embarque:

Nome---------- Pendente---------Finalizado

Davi---------- Sim--------------NULL

Carlos-------- Não--------------NULL

Manoel-------- Sim--------------NULL

Davi---------- Não--------------Sim

 

 

Tabela Descarga:

Nome---------- Pendente---------Finalizado

Davi-----------Não--------------Sim

Carlos-------- Não--------------NULL

Manoel-------- Sim--------------NULL

Davi---------- Sim--------------Null

 

 

Era pra retornar:

---------Atrasado----No_Prazo-----Finalizado

Davi:-----2-------------0---------------2

Carlos:---0-------------2--------------0

Manoel:---2-------------0--------------0

Atrasado =Pendente Sim

No Prazo= Pendente Não

Compartilhar este post


Link para o post
Compartilhar em outros sites

utilize o UNION e depois faça a somatória/contagem

Mas ué?

Eu fiz os counts e depois fiz as uniões e depois as somas...

tenho q fzer a cada condição... obviamente...

porem ele ta me retornando.

 

---------Atrasado----No_Prazo-----Finalizado

Davi:-----2-------------2--------------2

Carlos:---2-------------2--------------2

Manoel:---2-------------2--------------2

 

Ou seja... conta tudo a cada linha...

era pra contar os atrasados, no prazo... usuario por usuário... to esgotando minha criatividade já...

Compartilhar este post


Link para o post
Compartilhar em outros sites

para fazer a contagem/somatória tem que converter para int, utilizando o case para isso (implicitamente) ficaria assim:

 

dados para testes:

set nocount on
declare @tbEmb table (Nome varchar(20), Pendente char(3), Finalizado char(3))
insert into @tbEmb (Nome, Pendente, Finalizado) values ('Davi',		'Sim', null)
insert into @tbEmb (Nome, Pendente, Finalizado) values ('Carlos',	'Não', null)
insert into @tbEmb (Nome, Pendente, Finalizado) values ('Manoel',	'Sim', null)
insert into @tbEmb (Nome, Pendente, Finalizado) values ('Davi',		'Não', 'Sim')

declare @tbDes table (Nome varchar(20), Pendente char(3), Finalizado char(3))
insert into @tbDes (Nome, Pendente, Finalizado) values ('Davi',		'Não', 'Sim')
insert into @tbDes (Nome, Pendente, Finalizado) values ('Carlos',	'Não', null)
insert into @tbDes (Nome, Pendente, Finalizado) values ('Manoel',	'Sim', null)
insert into @tbDes (Nome, Pendente, Finalizado) values ('Davi',		'Sim', null)

obtendo todos os dados com o UNION ALL:

select Nome, case when isnull(Finalizado,'Não') = 'Sim' then 1 else 0 end Finalizado, case when Pendente = 'Não' then 0 else 1 end Atrasado, case when Pendente = 'Sim' then 0 else 1 end NoPrazo from @tbEmb
union all
select Nome, case when isnull(Finalizado,'Não') = 'Sim' then 1 else 0 end Finalizado, case when Pendente = 'Não' then 0 else 1 end Atrasado, case when Pendente = 'Sim' then 0 else 1 end NoPrazo from @tbDes

retorna:

Nome                 Finalizado  Atrasado    NoPrazo
-------------------- ----------- ----------- -----------
Davi                 0           1           0
Carlos               0           0           1
Manoel               0           1           0
Davi                 1           0           1
Davi                 1           0           1
Carlos               0           0           1
Manoel               0           1           0
Davi                 0           1           0

 

utilizando o SUM para sumarizar:

select nome, sum(Atrasado) Atrasado, sum(NoPrazo) NoPrazo, sum(Finalizado) Finalizado from (
select Nome, case when isnull(Finalizado,'Não') = 'Sim' then 1 else 0 end Finalizado, case when Pendente = 'Não' then 0 else 1 end Atrasado, case when Pendente = 'Sim' then 0 else 1 end NoPrazo from @tbEmb
union all
select Nome, case when isnull(Finalizado,'Não') = 'Sim' then 1 else 0 end Finalizado, case when Pendente = 'Não' then 0 else 1 end Atrasado, case when Pendente = 'Sim' then 0 else 1 end NoPrazo from @tbDes
) a
group by Nome

retorna:

nome                 Atrasado    NoPrazo     Finalizado
-------------------- ----------- ----------- -----------
Carlos               0           2           0
Davi                 2           2           2
Manoel               2           0           0

 

OBS.1: para o registro 'Davi' retornou 2 no Prazo, diferente da sua tabela de retorno que esta 0, mas segundo o que você passou:

Atrasado =Pendente Sim

No Prazo= Pendente Não

e o registro 'Davi' tem 2 registros com "Pendente Não" o último da tabela embarque e o primeiro da tabela descarga

 

talvez possa ser algum detalhe da regra de negócio, mas com czt você conseguirá ajustar sem maiores problemas

 

OBS.2: essa é uma forma de resolver, com czt podem ter outras mais ou menos elegantes

 

 

boa sorte

Compartilhar este post


Link para o post
Compartilhar em outros sites

para fazer a contagem/somatória tem que converter para int, utilizando o case para isso (implicitamente) ficaria assim:

 

dados para testes:

set nocount on
declare @tbEmb table (Nome varchar(20), Pendente char(3), Finalizado char(3))
insert into @tbEmb (Nome, Pendente, Finalizado) values ('Davi',		'Sim', null)
insert into @tbEmb (Nome, Pendente, Finalizado) values ('Carlos',	'Não', null)
insert into @tbEmb (Nome, Pendente, Finalizado) values ('Manoel',	'Sim', null)
insert into @tbEmb (Nome, Pendente, Finalizado) values ('Davi',		'Não', 'Sim')

declare @tbDes table (Nome varchar(20), Pendente char(3), Finalizado char(3))
insert into @tbDes (Nome, Pendente, Finalizado) values ('Davi',		'Não', 'Sim')
insert into @tbDes (Nome, Pendente, Finalizado) values ('Carlos',	'Não', null)
insert into @tbDes (Nome, Pendente, Finalizado) values ('Manoel',	'Sim', null)
insert into @tbDes (Nome, Pendente, Finalizado) values ('Davi',		'Sim', null)

obtendo todos os dados com o UNION ALL:

select Nome, case when isnull(Finalizado,'Não') = 'Sim' then 1 else 0 end Finalizado, case when Pendente = 'Não' then 0 else 1 end Atrasado, case when Pendente = 'Sim' then 0 else 1 end NoPrazo from @tbEmb
union all
select Nome, case when isnull(Finalizado,'Não') = 'Sim' then 1 else 0 end Finalizado, case when Pendente = 'Não' then 0 else 1 end Atrasado, case when Pendente = 'Sim' then 0 else 1 end NoPrazo from @tbDes

retorna:

Nome                 Finalizado  Atrasado    NoPrazo
-------------------- ----------- ----------- -----------
Davi                 0           1           0
Carlos               0           0           1
Manoel               0           1           0
Davi                 1           0           1
Davi                 1           0           1
Carlos               0           0           1
Manoel               0           1           0
Davi                 0           1           0

 

utilizando o SUM para sumarizar:

select nome, sum(Atrasado) Atrasado, sum(NoPrazo) NoPrazo, sum(Finalizado) Finalizado from (
select Nome, case when isnull(Finalizado,'Não') = 'Sim' then 1 else 0 end Finalizado, case when Pendente = 'Não' then 0 else 1 end Atrasado, case when Pendente = 'Sim' then 0 else 1 end NoPrazo from @tbEmb
union all
select Nome, case when isnull(Finalizado,'Não') = 'Sim' then 1 else 0 end Finalizado, case when Pendente = 'Não' then 0 else 1 end Atrasado, case when Pendente = 'Sim' then 0 else 1 end NoPrazo from @tbDes
) a
group by Nome

retorna:

nome                 Atrasado    NoPrazo     Finalizado
-------------------- ----------- ----------- -----------
Carlos               0           2           0
Davi                 2           2           2
Manoel               2           0           0

 

OBS.1: para o registro 'Davi' retornou 2 no Prazo, diferente da sua tabela de retorno que esta 0, mas segundo o que você passou:

Atrasado =Pendente Sim

No Prazo= Pendente Não

e o registro 'Davi' tem 2 registros com "Pendente Não" o último da tabela embarque e o primeiro da tabela descarga

 

talvez possa ser algum detalhe da regra de negócio, mas com czt você conseguirá ajustar sem maiores problemas

 

OBS.2: essa é uma forma de resolver, com czt podem ter outras mais ou menos elegantes

 

 

boa sorte

Perfeito, o resultado que quero é estes mesmo...

Porém \Não to conseguindo aplicar no Access... ERRO DE SINTAX(OPERADOR FALTANDO) É HOJE É HOJE...

Me ajuda... amanha to com esse proj pra apresentar pra 25 supervisores da area... só falta esta filtragem... q veio de ultimo caso... Não quero dar desculpas...

 

 

O campo Nome = quem e no Finalizado ou é Null ou é Sim.

Compartilhar este post


Link para o post
Compartilhar em outros sites

por favor, postar e pesquisar soluções no fórum correto: Access, estou movendo esse tópico para lá

 

não conheço o access, mas por esse tópico http://forum.imasters.com.br/topic/219904-clausula-case/page__p__755626__hl__iif__fromsearch__1#entry755626, diz que a função correta substituindo o CASE é IIF

Compartilhar este post


Link para o post
Compartilhar em outros sites

por favor, postar e pesquisar soluções no fórum correto: Access, estou movendo esse tópico para lá

 

não conheço o access, mas por esse tópico http://forum.imasters.com.br/topic/219904-clausula-case/page__p__755626__hl__iif__fromsearch__1#entry755626, diz que a função correta substituindo o CASE é IIF

Show Show Show...

Perfeito... thanks.... se pudesse dar nota... seria 10...

Vlw Brow... A apresentação foi concluída com exito...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.