Desconsiderar Registros Duplicados Numa Consulta

Delphi

12/04/2007

Olá pessoal, tudo bem? Espero que sim.

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

Aersoftware

Curtidas 0

Respostas

Djjunior

Djjunior

12/04/2007

vc pode usar um:

distinct ou um group by na sua consulta sql


GOSTEI 0
Aersoftware

Aersoftware

12/04/2007

Ficaria assim?

  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
Djjunior

Djjunior

12/04/2007

ñ ou vc usa o Distinct ou o Group by

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
Aersoftware

Aersoftware

12/04/2007

Olha, eu fiz 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;



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
Felipemarinho

Felipemarinho

12/04/2007

coloque o distinct dentro do parenteses assim :
...
CommandText :=
´Select (distinct FKCOD_ARTISTA)...

espero que isso sirva


GOSTEI 0
Aersoftware

Aersoftware

12/04/2007

Vou testar Felipe.

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
Aersoftware

Aersoftware

12/04/2007

Olá.

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
POSTAR