Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Utilizando subselect para contar linhas


Viperino

Pergunta

Tópico inicial: http://scriptbrasil.com.br/forum/index.php?showtopic=148684

O script ficou grande por causa da sintaxe do NULL mesmo. Como você tem q colocar o IS antes, não dá pra fazer apenas 1 select para as duas opções.... rs.

Tem outra forma de fazer, mas acho viável apenas quando a estrutura fica MUITO grande, ou as execuções precisarem de ser dinâmicas: você cria uma variável varchar, insere o script nela e manda executar a variável.

Ficaria mais ou menos assim:

Desta forma, você cria seus scripts dinamicamente!! Se preferir... rs.

Eu gostava, mas acho que os meus conhecimentos não dão para tanto... :(

Em relação a outra questão. Não sei se entendi direito, mas você quer um total por [Tipo de Análise]? Se for, testa aí e vê se funciona:

Uma dúvida: porque o TOP (100) PERCENT? Se você está pegando 100%, esta informação pode ser suprimida....

O TOP 100.... é automático, não sou eu que introduzo, é o SQL quando faço execute.

Obrigado mais uma vez pela resposta. Mas não era isso que eu pretendia. A ver se me consigo fazer perceber melhor com uma imagem:

untitled.JPG

Como deve conseguir ver, há 1 análise do tipo 1, 1 do tipo 2, 4 do tipo 3 e por aí adiante. Era esse valor que eu queria obter com o count mas não estou a conseguir fazer.

Espero ter sido mais esclarecedor.

Editado por fulvio
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Agora entendi...

O problema é q você está querendo contar as linhas do resultado do script. Com o group by, fica mais dificil esta contagem... outra coisa será a forma de visualização do resultado. O contador se repetirá para cada linha, ex.:

Dados:

1 1 1

2 2 1

3 4 2

3 9 1

3 12 4

3 20 3

4 26 3

Resultado:

1 1 1 1

2 2 1 1

3 4 2 4

3 9 1 4

3 12 4 4

3 20 3 4

4 26 3 1

Perceba que no "Tipo de Analise" de código 3, o contador repete o total 4 em todas as linhas...

Mas vamos lá. Fiz um subselect para retornar o count. Vê se o script roda:

SELECT dbo.Tipo_Analise.TA_Id AS [Tipo de Análise], 
dbo.Historico_Analises.HA_Id AS [Análise Efectuada], 
dbo.Historico_Analises.HA_Ind_Suplem AS Variante,
(select count(TA_Id) from dbo.Tipo_Analise t where t.TA_Id=ta.TA_Id group by TA_Id) AS Total
FROM dbo.T_Ana_Ind INNER JOIN dbo.Tipo_Analise ta ON dbo.T_Ana_Ind.TAI_TA_Id = dbo.Tipo_Analise.TA_Id 
INNER JOIN dbo.Historico_Analises ON dbo.Tipo_Analise.TA_Id = dbo.Historico_Analises.HA_TA_Id
GROUP BY dbo.Tipo_Analise.TA_Id, dbo.Historico_Analises.HA_Id, dbo.Historico_Analises.HA_Ind_Suplem
ORDER BY [Tipo de Análise]

Link para o comentário
Compartilhar em outros sites

  • 0

Estranho....

Refiz a estrutura do script, pois o Management coloca muita coisa. Ai você acaba se perdendo... rs.

Refeito (o mesmo que postou acima):

SELECT ta.TA_Id AS [Tipo de Análise], há.HA_Id AS [Análise Efectuada], há.HA_Ind_Suplem AS Variante,
(select count(t.TA_Id) from dbo.Tipo_Analise t where t.TA_Id=ta.TA_Id group by t.TA_Id) AS Total
FROM dbo.T_Ana_Ind tai INNER JOIN dbo.Historico_Analises há ON tai.TAI_TA_Id=há.HA_TA_Id
INNER JOIN dbo.Tipo_Analise ta ON há.TAI_TA_Id=ta.TA_Id 
GROUP BY ta.TA_Id, há.HA_Id, há.HA_Ind_Suplem
ORDER BY [Tipo de Análise]
O que pode estar ocorrendo, é o resgate do campo TA_ID na tabela errada. Sendo assim, mesmo com vários "Tipo de Analise" de código 3, o contador está resgatando apenas uma inserção. A duplicidade do "Tipo de Analise" é o produto de um resultado entre as tabelas. Faça o teste ai. Mas ao invés de pegar o TA_ID da tabela dbo.Tipo_Analise, vou pegar o count da tabela dbo.Historico_Analises . Ficará assim:
SELECT ta.TA_Id AS [Tipo de Análise], há.HA_Id AS [Análise Efectuada], há.HA_Ind_Suplem AS Variante,
(select count(h.TAI_TA_Id) from dbo.Historico_Analises h where h.TAI_TA_Id=há.TAI_TA_Id group by h.TAI_TA_Id) AS Total
FROM dbo.T_Ana_Ind tai INNER JOIN dbo.Historico_Analises há ON tai.TAI_TA_Id=há.HA_TA_Id
INNER JOIN dbo.Tipo_Analise ta ON há.TAI_TA_Id=ta.TA_Id 
GROUP BY ta.TA_Id, há.HA_Id, há.HA_Ind_Suplem
ORDER BY [Tipo de Análise]

Roda aí e vê se o resultado está ok....

Link para o comentário
Compartilhar em outros sites

  • 0

Antes de mais, quero agradecer o tempo que perdeu comigo hoje. Muito obrigado.

Bem, agora fiquei todo confundido com essas trocas de nomes das tabelas. :)

Há aqui qualquer coisa que correu mal pois não executa. Dá erro na variável TAI-TA_Id.

Msg 207, Level 16, State 1, Line 4

Invalid column name 'TAI_TA_Id'.

Msg 207, Level 16, State 1, Line 2

Invalid column name 'TAI_TA_Id'.

Link para o comentário
Compartilhar em outros sites

  • 0

De nada... estamos aqui pra ajudar mesmo!! :.)

O erro foi meu. A coluna 'TAI_TA_Id' não existe na tabela Historico_Analises.

Sintaxe:

SELECT ta.TA_Id AS [Tipo de Analise], há.HA_Id AS [Analise Efectuada], há.HA_Ind_Suplem AS Variante,

(select count(h.HA_TA_Id) from dbo.Historico_Analises h where h.HA_TA_Id=há.HA_TA_Id group by h.HA_TA_Id) AS Total

FROM dbo.T_Ana_Ind tai INNER JOIN dbo.Historico_Analises há ON tai.TAI_TA_Id=há.HA_TA_Id

INNER JOIN dbo.Tipo_Analise ta ON há.HA_TA_Id=ta.TA_Id

GROUP BY ta.TA_Id, há.HA_Id, há.HA_Ind_Suplem

ORDER BY [Tipo de Analise]

Não coloquei como CODE, pois está acentuando as palavras. Roda aí e vê se está ok. Caso dê certo, me fala que te explico.

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite.

Cheguei agora da aula. Já experimentei e não executa. Dá a seguinte mensagem:

Msg 8120, Level 16, State 1, Line 3

Column 'dbo.Historico_Analises.HA_TA_Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Viperino,

Teste esta sintaxe:

SELECT ta.TA_Id AS [Tipo de Analise], há.HA_Id AS [Analise Efectuada], há.HA_Ind_Suplem AS Variante,

(select count(h.HA_TA_Id) from dbo.Historico_Analises h where h.HA_TA_Id=há.HA_TA_Id group by h.HA_TA_Id) AS Total

FROM dbo.T_Ana_Ind tai INNER JOIN dbo.Historico_Analises há ON tai.TAI_TA_Id=há.HA_TA_Id

INNER JOIN dbo.Tipo_Analise ta ON há.HA_TA_Id=ta.TA_Id

GROUP BY ta.TA_Id, há.HA_Id, há.HA_Ind_Suplem, há.HA_TA_Id

ORDER BY [Tipo de Analise]

Caso dê erro, pode pegar meu MSN no meu perfil que conversaremos on line, ok?

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, fulvio.

Peço desculpa por só responder agora mas andar a trabalhar na estrada de dia e aulas na universidade à noite deixam muito pouco tempo sequer para aceder à net.

É quase meia-noite aqui mas fui experimentar o que postou e agora funciona. Muito obrigado. Mas gostaria que me explicasse aquilo do há, h, t.... Sinceramente, complicou. E tenho que simplificar a coisa, senão vão logo perceber que não fui eu que fiz. rs...

Obrigado pela oferta do MSN. Agora não me parece que esteja online, mas amanhã tenho um trabalho bem cedo que conto acabar ainda de manhã e se estiver disponível, por volta da hora do almoço (aqui) voltarei para ver se está por aqui.

Entretanto, não querendo abusar, sabe-me dizer porque não consigo que apareça o nome dos Utentes aqui em baixo?

untitled.JPG

O query corre certinho, que é dar os utentes (médicos ou utentes normais) que mais vezes mudaram de zona. Mas o objectivo é ordenar alfabeticamente por nome de utente. (Não sei se me expliquei bem...)

Bem, muito obrigado pela sua ajuda até agora.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...