Utilizamos cookies propias y de terceros. Al navegar entendemos que aceptas el uso de cookies. +Info.
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Usuario
· Wiki

Nick


Contraseña


Nuevo usuario


English
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - depurar registros duplicados
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information depurar registros duplicados

Publicar nuevo tema Responder al tema
Foros de discusión » Microsoft SQL Server, motor de base de datos profesional   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
ceci_jjy
Usuario


Registrado: Dec 26, 2006
Mensajes: 1

Asunto: depurar registros duplicados Responder citando

Estimados amigos, queria hacerles una consulta dado que tengo un problema con la base de datos que importe desde fox. Resulta que tengo los siguientes campos:
COD_PRESUPUESTO(int), COD_LINEAPRESUP(int), CANT (int) Y DESCRIP (char 40). El problema surge con los registros anteriores al nuevo sistema q estamos implementando (cerca de 20000 registrso) cuando la descripcion es demasiado extensa , por lo que su continuación prosigue en el registro siguiente, duplicandome los dos primeros campos mencionados y colocando en cero la cantidad.
Ejemplo.
COD_PRESUPUESTO LINEAPRESUP CANT DESCRIP
1001 1 3 placares con tres puertas
1001 1 0 centrales y dos cajones
1001 1 0 en la parte inferior
1001 2 1 cama de dos plazas
1002 1 2 puertas macizas

Como veran necesito de algunas sentencias para concatenar el campo descripcion y eliminar los registros duplicados.
Desde ya muchas gracias.
MensajePublicado:
Mar Dic 26, 2006 4:41 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: depurar registros duplicados Responder citando



Anuncios



ceci_jjy escribió:
Estimados amigos, queria hacerles una consulta dado que tengo un problema con la base de datos que importe desde fox. Resulta que tengo los siguientes campos:
COD_PRESUPUESTO(int), COD_LINEAPRESUP(int), CANT (int) Y DESCRIP (char 40). El problema surge con los registros anteriores al nuevo sistema q estamos implementando (cerca de 20000 registrso) cuando la descripcion es demasiado extensa , por lo que su continuación prosigue en el registro siguiente, du....


Entendemos el problema, aunque lo más sencillo es que realices una miniaplicación con el lenguaje de programación que hayas utilizado para realizar el programa. Con la miniaplicación puedes realizar una consulta SQL (sin ordenar, para que el orden sea el de inserción) e ir concatenando el campo "DESCRIP" mientras el campo COD_PRESUPUESTO sea igual. Y cogerás el valor del campo CANT del primer registro.

El hecho de que no puedas ordenar por COD_PRESUPUESTO y por CANT (descendente) que sería lo ideal es porque no hay ningún campo que te garantice que si tienes tres registros con el mismo COD_PRESUPUESTO no te garantizará que se contatene el valor del campo DESCRIP de forma correcta, te podría quedar:

"placares con tres puertas en la parte inferior centrales y dos cajones"

en vez de

"placares con tres puertas centrales y dos cajones en la parte inferior"

Podrías utilizar una tabla temporal para ir insertando los registros.

El código fuente en Borland Delphi podría ser algo así:

Código:

procedure TForm1.bActualizarTablaClick(Sender: TObject);
var
  descripcionCompleta : string;
  cantidad : Integer;
begin
  //consulta SQL para obtener las líneas con COD_PRESUPUESTO sin duplicidad
  tConsulta.Close;
  tConsulta.SQL.Clear;
  tConsulta.SQL.Add('select distinct (COD_PRESUPUESTO)');
  tConsulta.SQL.Add('from nombre_tabla');
  tConsulta.Open;

  while not tConsulta.Eof do
  begin
    //consulta SQL para mostrar las líneas duplicadas de cada COD_PRESUPUESTO
    tConsulta2.Close;
    tConsulta2.SQL.Clear;
    tConsulta2.SQL.Add('select COD_PRESUPUESTO, COD_LINEAPRESUP, CANT, DESCRIP');
    tConsulta2.SQL.Add('from nombre_tabla');
    tConsulta2.SQL.Add('where COD_PRESUPUESTO = :pCodPres');
    tConsulta2.ParamByName('pCodPres').DataType := ftInteger;
    tConsulta2.ParamByName('pCodPres').AsInteger :=
        tConsulta.fieldbyname('COD_PRESUPUESTO').AsInteger;
    tConsulta2.Open;
    descripcionCompleta := '';
    cantidad := tConsulta2.fieldbyname('CANT').AsInteger;
    while not tConsulta2.Eof do
    begin
      if descripcionCompleta = '' then
        descripcionCompleta := tConsulta2.fieldbyname('DESCRIP').AsString
      else
        descripcionCompleta := descripcionCompleta + ' ' +
            tConsulta2.fieldbyname('DESCRIP').AsString;
      tConsulta2.Next;
    end;
    //consulta SQL para insertar el registro correcto en una tabla temporal
    tConsultaInsercion.Close;
    tConsultaInsercion.SQL.Clear;
    tConsultaInsercion.SQL.Add('insert into nombre_tabla (');
    tConsultaInsercion.SQL.Add('  COD_PRESUPUESTO, COD_LINEAPRESUP, CANT, DESCRIP)');
    tConsultaInsercion.SQL.Add('  values (:pCodPres, :pCodLinea, :pCantidad, :pDescripcion)');
    tConsultaInsercion.ParamByName('pCodPres').DataType := ftInteger;
    tConsultaInsercion.ParamByName('pCodPres').AsInteger :=
        tConsulta2.fieldbyname('COD_PRESUPUESTO').asInteger;
    tConsultaInsercion.ParamByName('pCodLinea').DataType := ftInteger;
    tConsultaInsercion.ParamByName('pCodLinea').AsInteger :=
        tConsulta2.fieldbyname('COD_LINEAPRESUP').asInteger;
    tConsultaInsercion.ParamByName('pCantidad').DataType := ftInteger;
    tConsultaInsercion.ParamByName('pCantidad').AsInteger := cantidad;
    tConsultaInsercion.ParamByName('pDescripcion').DataType := ftInteger;
    tConsultaInsercion.ParamByName('pDescripcion').AsString := descripcionCompleta;
    tConsultaInsercion.ExecSQL;
    tConsulta.Next;
  end;
  tConsulta.Close;
  tConsulta2.Close;
  tConsultaInsercion.Close;
end;


Donde tConsulta, tConsulta2, tConsultaInsercion son componentes de tipo TQuery, que estarán enlazados con la base de datos SQL Server, mediante un ODBC previamente creado.
MensajePublicado:
Dom Jun 15, 2008 6:52 pm
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Microsoft SQL Server, motor de base de datos profesional  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Este sitio web NO CONTIENE malware, todos los programas con código fuente aquí. Autor: Alonso Javier Pérez Díaz Google+ Síguenos en Google+