Fórum Desconsiderar Registros Duplicados Numa Consulta #340268
12/04/2007
0
Estou tentando pegar um dado pra estatística, em 3 tabelas diferentes. A idéia é somar os resultados e exbir.
Bom, consigo fazer iss facil com um sql assim:
DmDados.ClientHistNacRoteiristas.Close; With DmDados.SqlHistNacRoteiristas do begin close; CommandText := ´Select * From TB_HISTNAC_ROTEIRISTAS where FKCOD_TITULO_NACIONAL= ´ + DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacRoteiristas.Open; Roteiro := DmDados.ClientHistNacRoteiristas.RecordCount;
Depois eu só somo as variáveis que receberam os números.
Bom, acontece que eu posso ter mais de uma história por edição escrita pelo menos roteirista, por exemplo, e ao invés de contar o total de roteiristas da história, gostaria de contar o total de roteiristas diferentes, sem considerar quando aparece um registro que ja tinha sido contato.
Como posso fazer isso?
Aersoftware
Curtir tópico
+ 0Posts
12/04/2007
Djjunior
distinct ou um group by na sua consulta sql
Gostei + 0
12/04/2007
Aersoftware
DmDados.ClientHistNacRoteiristas.Close; With DmDados.SqlHistNacRoteiristas do begin close; CommandText := ´Select distinct(FkCod_Titulo) From TB_HISTNAC_ROTEIRISTAS where FKCOD_TITULO_NACIONAL= ´ + DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacRoteiristas.Open; Roteiro := DmDados.ClientHistNacRoteiristas.RecordCount;
?? Preciso usar o Group By também? :x
Gostei + 0
12/04/2007
Djjunior
o Distinct funciona como o groupy by para todas colunas do select, mas a desvantagem é que vc ñ pode usar colunas calculadas (sum(), avg(), count etc)
já o group by você já pode estar utilizando essas funções em quaisquer colunas
Gostei + 0
12/04/2007
Aersoftware
DmDados.ClientHistNacRoteiristas.Close; With DmDados.SqlHistNacRoteiristas do begin close; CommandText := ´Select distinct(FKCOD_ARTISTA), PKCOD_HISTNAC_ROTEIRO, FKCOD_HISTORIA_NACIONAL,´ +´FKCOD_EDICAO_NACIONAL, FKCOD_TITULO_NACIONAL, FKCOD_EDITORA_ORIGINAL,´ +´FKCOD_EDITORA_NACIONAL From TB_HISTNAC_ROTEIRISTAS where FKCOD_TITULO_NACIONAL= ´ + DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacRoteiristas.Open; Roteiro := DmDados.ClientHistNacRoteiristas.RecordCount;
Ele faz a consulta, mas distingue dois registros iguais. Coloquei o distinct no FKCOD_ARTISTA pq é o campo que quero desconsiderar caso esteja em duplicidade.
Mas agora me lembrei de uma coisa.. Tem como destinguir esses campos duplicados em mais de uma tabela? Tipo, estou fazendo assim:
DmDados.ClientHistNacRoteiristas.Close; With DmDados.SqlHistNacRoteiristas do begin close; CommandText := ´Select distinct(FKCOD_ARTISTA), PKCOD_HISTNAC_ROTEIRO, FKCOD_HISTORIA_NACIONAL,´ +´FKCOD_EDICAO_NACIONAL, FKCOD_TITULO_NACIONAL, FKCOD_EDITORA_ORIGINAL,´ +´FKCOD_EDITORA_NACIONAL From TB_HISTNAC_ROTEIRISTAS where FKCOD_TITULO_NACIONAL= ´ + DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacRoteiristas.Open; Roteiro := DmDados.ClientHistNacRoteiristas.RecordCount; DmDados.ClientHistNacDesenhistas.Close; With DmDados.SqlHistNacDesenhistas do begin close; CommandText := ´Select distinct(FKCOD_ARTISTA), PKCOD_HISTNAC_DESENHO, FKCOD_HISTORIA_NACIONAL,´ +´FKCOD_EDICAO_NACIONAL, FKCOD_TITULO_NACIONAL, FKCOD_EDITORA_ORIGINAL,´ +´FKCOD_EDITORA_NACIONAL From TB_HISTNAC_DESENHISTAS where FKCOD_TITULO_NACIONAL= ´ + DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacDesenhistas.Open; Desenho := DmDados.ClientHistNacDesenhistas.RecordCount; DmDados.ClientHistNacArteFinalistas.Close; With DmDados.SqlHistNacArteFinalistas do begin close; CommandText := ´Select distinct(FKCOD_ARTISTA), PKCOD_HISTNAC_ARTEFINAL, FKCOD_HISTORIA_NACIONAL,´ +´FKCOD_EDICAO_NACIONAL, FKCOD_TITULO_NACIONAL, FKCOD_EDITORA_ORIGINAL,´ +´FKCOD_EDITORA_NACIONAL From TB_HISTNAC_ARTEFINAL where FKCOD_TITULO_NACIONAL= ´ + DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacArteFinalistas.Open; ArteFinal := DmDados.ClientHistNacArteFinalistas.RecordCount; DmDados.ClientHistNacColoristas.Close; With DmDados.SqlHistNacColoristas do begin close; CommandText := ´Select distinct(FKCOD_ARTISTA), PKCOD_HISTNAC_COR, FKCOD_HISTORIA_NACIONAL,´ +´FKCOD_EDICAO_NACIONAL, FKCOD_TITULO_NACIONAL, FKCOD_EDITORA_ORIGINAL,´ +´FKCOD_EDITORA_NACIONAL From TB_HISTNAC_COLORISTAS where FKCOD_TITULO_NACIONAL= ´ + DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacColoristas.Open; Cor := DmDados.ClientHistNacColoristas.RecordCount; LbNumeroArtistasResp.Caption := IntToStr(Roteiro + Desenho + ArteFinal + Cor);
E, tipo.. um artista pode escrever uma edição e desenhar a outra. Então acho que, alem de distinguir os repetidos dentro de cada tabela, teria q distinguir os repetidos entre todas outras.. :x
Gostei + 0
16/04/2007
Felipemarinho
...
CommandText :=
´Select (distinct FKCOD_ARTISTA)...
espero que isso sirva
Gostei + 0
17/04/2007
Aersoftware
Mas eu tive pensando uma coisa, não sei se pode funcionar ou se não é pra fazer assim:
Como eu quero pegar os registros das 4 tabelas, sem que se repitam, tem como eu usar o distinct num único select, e informar pra buscar nas 4 tabelas juntas, já que o nome da Chave Estrangeira que quero é igual em todas tabelas, o que vai mudar de campo é o nome da chave primária, teria como? Tipo algo assim:
´Select (distinct FKCOD_ARTISTA) From TbRoteiristas, TbDesenhistas, TbArteFinalistas, TbColoristas´;
Procurando um campo, em várias tabelas, que eles nao se repitam. O que não sei é que se ele vai distinguir os repetidos em todas tabelas, inclusive comparando entre elas.
Gostei + 0
18/04/2007
Aersoftware
Consegui fazer com que ele não me mostre os registros repetidos nas tabelas separadas, usando o Distinct, mas ainda não consegui achar uma solução pra fazer essa comparação também com outras tabelas. Estou fazendo assim:
DmDados.ClientHistNacRoteiristasCons.Close; With DmDados.SqlHistNacRoteiristas do begin close; CommandText := ´Select distinct FKCOD_ARTISTA From TB_HISTNAC_ROTEIRISTAS where FKCOD_TITULO_NACIONAL= ´ + DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacRoteiristasCons.Open; Roteiro := DmDados.ClientHistNacRoteiristasCons.RecordCount; DmDados.ClientHistNacDesenhistasCons.Close; With DmDados.SqlHistNacDesenhistas do begin close; CommandText := ´Select distinct FKCOD_ARTISTA From TB_HISTNAC_DESENHISTAS where FKCOD_TITULO_NACIONAL= ´ +DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacDesenhistasCons.Open; Desenho := DmDados.ClientHistNacDesenhistasCons.RecordCount; DmDados.ClientHistNacArteFinalistasCons.Close; With DmDados.SqlHistNacArteFinalistas do begin close; CommandText := ´Select distinct FKCOD_ARTISTA From TB_HISTNAC_ARTEFINAL where FKCOD_TITULO_NACIONAL= ´ +DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacArteFinalistasCons.Open; ArteFinal := DmDados.ClientHistNacArteFinalistasCons.RecordCount; DmDados.ClientHistNacColoristasCons.Close; With DmDados.SqlHistNacColoristas do begin close; CommandText := ´Select distinct FKCOD_ARTISTA From TB_HISTNAC_COLORISTAS where FKCOD_TITULO_NACIONAL= ´ +DmDados.ClientTitulosNacionaisPKCOD_TITULO_NACIONAL.AsString; open; end; DmDados.ClientHistNacColoristasCons.Open; Cor := DmDados.ClientHistNacColoristasCons.RecordCount; LbNumeroArtistasResp.Caption := IntToStr(Roteiro + Desenho + ArteFinal + Cor);
Mas nesse caso, se eu tiver o mesmo Artista na tabela Roteiristas e na tabela Desenhista, do mesmo Título, ele me mostra 2 registros diferentes, e gostaria que eles se ´anulassem´, mostrando apenas um.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)