Ir para conteúdo

Arquivado

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

FabianoSouza

Count em tabela derivada

Recommended Posts

Preciso fazer contagem na tab derivada CD

SELECT        CD.ContaDeptos, InscricoesTurma.InscritosTurmaCodTurma
FROM            InscricoesTurma LEFT OUTER JOIN
                             (SELECT        COUNT(InscritosTurmaCodDeptoHistorico) AS ContaDeptos
                               FROM            InscricoesTurma AS InscricoesTurma_1) AS CD ON 
                         InscricoesTurma.InscritosTurmaCodDeptoHistorico = CD.ContaDeptos
GROUP BY CD.ContaDeptos, InscricoesTurma.InscritosTurmaCodTurma
HAVING        (InscricoesTurma.InscritosTurmaCodTurma = 1086)

Isso não está funcionando.

Help.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloquei apenas um "pedaço" da consulta.

Vou exibir alguns campos da tab InscricoesTurma (e ela fará join com outras tabs) aí acho que daria "conflito" fazendo count diretamente nela, não?

Por isso achei que seria melhor contar numa tab derivada.

 

Meu pensamento está certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Preciso fazer contagem na tab derivada CD

...

Isso não está funcionando.

 

Fabiano, que tal desenvolver o código por partes? Por exemplo, primeiro crie uma consulta para totalizar. Aliás, o que é para totalizar? Qual é a coluna para utilizar no agrupamento?

Se nos informar qual é o objetivo dessa totalização, o que contém a tabela InscricoesTurma, e as colunas principais dessa tabela, podemos fornecer sugestões eficazes.

;with CD as (
SELECT ?x, Count(InscritosTurmaCodDeptoHistorico) AS ContaDeptos
  from InscricoesTurma
  group by ?x
)
SELECT *
  from CD;

Compartilhar este post


Link para o post
Compartilhar em outros sites

OK. Vamos lá.

 

Tenho a tab InscricoesTurma, armazena as pessoas que se inscrevem para uma determinada turma de um curso.

Nela guardo também o código do cargo e do departamento da pessoa que foi inscrita.

Os campos para essa finalidade são InscritosTurmaCodDeptoHistorico e InscritosTurmaCodCargosHistorico.

 

Essa tab faz JOIN com tab Turmas (onde armazeno dados de turmas de treinamento) e JOIN com tab Funcionario, para buscar alguns campos.

 

Aqui é o ponto-chave.

Preciso contar e somar as colunas InscritosTurmaCodDeptoHistorico e InscritosTurmaCodCargosHistorico.

O objetivo é saber quantos cargos e departamentos distintos "foram inscritos".

Parece meio estranho porque não se inscreve cargos nem departamentos num evento, se inscreve pessoas, certo?

 

O raciocínio é;

"Seu convidei a área de vendas, financeiro, marketing e RH (4 deptos.) para o evento, por que tenho pessoas inscritas pertencentes a apenas 2 deptos?", por exemplo.

 

O mesmo raciocínio seria para cargos.

 

Meu select está assim.

SELECT        
InscricoesTurma.InscritosTurmaConfirmacao
, CadPessoal.CadPessoalSexo, Eventos.EventosCod
, Eventos.EventosCodServico

FROM InscricoesTurma 
INNER JOIN
Turmas ON InscricoesTurma.InscritosTurmaCodTurma = Turmas.TurmasCod 
INNER JOIN
Eventos ON Turmas.TurmasCod = Eventos.EventosCodTurma 
INNER JOIN
Funcionario ON InscricoesTurma.InscritosTurmaCodFuncionario = Funcionario.FunCod 
INNER JOIN
CadPessoal ON Funcionario.FunCodCadPessoal = CadPessoal.CadPessoalCod
WHERE        (Eventos.EventosCod = 1044) AND (Eventos.EventosCodServico = 1)

Agradeço desde já pela atenção dos colegas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabiano, para "saber quantos cargos e departamentos distintos foram inscritos", para cada turma, a sugestão é o seguinte código:

-- código 1
SELECT InscritosTurmaCodTurma, 
       Count(distinct InscritosTurmaCodDeptoHistorico) as QtdDepto,
       Count(distinct InscritosTurmaCodCargosHistorico) as QtdCargos       
  from InscricoesTurma
  group by InscritosTurmaCodTurma;

linkedin.gif José Diz Belo Horizonte, MG - Brasil

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está retornando as colunas QtdDepto e QtdCargos exatamente com a mesma informação

 

Fabiano, o código 1 contabiliza quantos departamentos diferentes existem por turma e também quantos cargos diferentes existem por turma. Você executou o código 1 sem qualquer modificação? Se sim, e se o resultado apresentou os mesmos valores para QtdDepto e QtdCargos para uma determinada turma, é somente uma coincidência.

 

Para comprovar, eis outro código de demonstração.

-- código 2
use tempdb;
go

CREATE TABLE InscricoesTurma (
  InscritosTurmaCodTurma int not null,
  InscritosTurmaCodFuncionario int not null,
  InscritosTurmaCodDeptoHistorico int not null,
  InscritosTurmaCodCargosHistorico int not null,
  constraint I0 primary key (InscritosTurmaCodTurma, InscritosTurmaCodFuncionario)
);
go

-- carga dos dados de teste
set NoCount on;
INSERT into InscricoesTurma values
  (1, 2987, 2, 7), (1, 0555, 5, 7), (1, 6827, 2, 6);
go

declare @CodTurma int;
set @CodTurma = 1;

-- retorna contadores
SELECT InscritosTurmaCodTurma, 
       Count(distinct InscritosTurmaCodDeptoHistorico) as QtdDepto,
       Count(distinct InscritosTurmaCodCargosHistorico) as QtdCargos       
  from InscricoesTurma
  where InscritosTurmaCodTurma = @CodTurma
  group by InscritosTurmaCodTurma;

-- retorna códigos de departamento e de cargo
SELECT InscritosTurmaCodTurma, 'Depto' as [Código de],
       InscritosTurmaCodDeptoHistorico as Código
  from InscricoesTurma
  where InscritosTurmaCodTurma = @CodTurma

UNION

SELECT InscritosTurmaCodTurma, 'Cargo',
       InscritosTurmaCodCargosHistorico
  from InscricoesTurma
  where InscritosTurmaCodTurma = @CodTurma

order by InscritosTurmaCodTurma, [Código de], [Código];
go

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, tem toda toda razão. Eu que me confundi.

 

Uma correção no que solicitei.

A contagem deve se dar noutra tabela que chamo por um JOIN, a tab HistoricoCargos (depois vejo a de Deptos)

SELECT InscricoesTurma.InscritosTurmaCodTurma, HistoricoCargos.CargosHistoricoCodCargo, 
COUNT(DISTINCT InscricoesTurma.InscritosTurmaCodCargosHistorico)  AS QtdCargos
FROM            
InscricoesTurma INNER JOIN
HistoricoCargos 
ON InscricoesTurma.InscritosTurmaCodCargosHistorico = HistoricoCargos.CargosHistoricoCod
WHERE        
(InscricoesTurma.InscritosTurmaCodTurma = 1086)
GROUP BY 
InscricoesTurma.InscritosTurmaCodTurma, HistoricoCargos.CargosHistoricoCodCargo

Adaptei sua consulta para esta realidade e beleza. Funcionou.

 

A consulta retorna isso

 

contagem.png

 

O retorno está correto: o cargo 4 repete 3 vezes, o 14 repete 3 vezes, os demais aparecem apenas uma vez. Isso está correto: faz contagem distintamente como pedi.

 

Olhando a coluna QtdeCargos percebemos duas quantidades diferentes: 1 e 3.

Preciso contar também essa informação. No caso, seria igual a 2.

É possível fazer pelo banco ou teria que ser na aplicação?

 

Mais uma vez, obrigado.

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.