none
DE QUE MANERA PUEDO ENUMERAR LOS REGISTROS DUPLICADO EN UNA TABLA , LA VERSION DEL SQL ES 2000 RRS feed

  • Pregunta

  • DANDO EL SIGUIENTE EJEMPLO CON LAS VARIABLES  NUMERO DEL DOCUMENTO  Y CONSECUTIVO DEL ITEM

     

     NUM_DOC     ITEM

      890               1

      250               1

      250               2

      250              3

      511              1

    miércoles, 19 de enero de 2011 14:55

Respuestas

  • resolvi   llevar  la tabla a un motor  sql 2008 ejecutar  la instruccion

    Select   num_doc,item = row_number() over (partition by num_doc order by num_doc)

    from cxP_inf_con

     

    y posteiromente  migrar los datos  al motor  sql 2000 de esta forma se solucino la dificultad .

     

    gracias .

     

     

    • Marcado como respuesta santo_51 jueves, 20 de enero de 2011 15:43
    miércoles, 19 de enero de 2011 15:26

Todas las respuestas

  • resolvi   llevar  la tabla a un motor  sql 2008 ejecutar  la instruccion

    Select   num_doc,item = row_number() over (partition by num_doc order by num_doc)

    from cxP_inf_con

     

    y posteiromente  migrar los datos  al motor  sql 2000 de esta forma se solucino la dificultad .

     

    gracias .

     

     

    • Marcado como respuesta santo_51 jueves, 20 de enero de 2011 15:43
    miércoles, 19 de enero de 2011 15:26
  • La cosa no es tan facil de hacer en SQL Server 2000, y mucha mas si no hay una columna o grupo de columnas que podamos usar para identifircar cada fila de forma unica.

    Si tenemos tres filas con igual valor en la columna [num_doc], como:

    num_doc
    250
    250
    250

    entonces no hay manera de identificar cada fila de forma unica, y esto hace mas dificil el problema. Una opcion es usar una tabla auxiliar de números.

    Ejemplo:

    DECLARE @T TABLE (
    NUM_DOC int NOT NULL
    );
    
    INSERT INTO @T(num_doc)
    SELECT 890 UNION ALL
    SELECT 250 UNION ALL
    SELECT 250 UNION ALL
    SELECT 250 UNION ALL
    SELECT 511;
    
    SELECT
     B.NUM_DOC,
     A.number AS ITEM
    FROM
     master..spt_values AS A
     INNER JOIN
     (
     SELECT
      NUM_DOC,
      COUNT(*) AS cnt
     FROM
      @T
     GROUP BY
      NUM_DOC
     ) AS B
     ON A.number <= B.cnt
    WHERE
     [type] = 'P'
     AND number > 0
    ORDER BY
     B.NUM_DOC,
     item;
    GO
    
    Resultado:
    
    NUM_DOC	ITEM
    250	1
    250	2
    250	3
    511	1
    890	1
    

    En el ejemplo estoy simulando la tabla auxiliar de numeros (master..spt_values), pero es una tabla que se puede crear sin mucho problema y que es muy util para resolver ciertos problemas.

    Why should I consider using an auxiliary numbers table?

    Si la tabla tiene alguna restriccion de clave primaria o unica, entonces podemos usar un query correlacionado, pero este metodo no tiene buen desempeño cuando el numero de particiones es grande y ademas tenemos muchas filas por particion.

    Ejemplo (fijate que adicione una clave artificial a la tabla):

    USE tempdb;
    GO
    DECLARE @T TABLE (
    sk int NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    NUM_DOC int NOT NULL
    );
    
    INSERT INTO @T(num_doc)
    SELECT 890 UNION ALL
    SELECT 250 UNION ALL
    SELECT 250 UNION ALL
    SELECT 250 UNION ALL
    SELECT 511;
    
    SELECT
     T1.NUM_DOC,
     (
     SELECT COUNT(*)
     FROM @T AS T2
     WHERE T2.NUM_DOC = T1.NUM_DOC AND T2.sk <= T1.sk
     ) AS ITEM
    FROM
     @T AS T1
    ORDER BY
     T1.NUM_DOC,
     item;
    GO
    

     


    AMB

    Some guidelines for posting questions...

    miércoles, 19 de enero de 2011 16:47
  • Me alegra que hayas resuelto el problema, pero de verdad que no era necesario hacerlo de esa forma.

    Podias haber alterado la tabla, agregar una columna con propiedad identity y luego usar la sentencia que adjunte al final de mi primera respuesta.

    USE tempdb;
    GO
    CREATE TABLE T (
    NUM_DOC int NOT NULL
    );
    
    INSERT INTO T(num_doc)
    SELECT 890 UNION ALL
    SELECT 250 UNION ALL
    SELECT 250 UNION ALL
    SELECT 250 UNION ALL
    SELECT 511;
    
    SELECT * FROM T ORDER BY NUM_DOC;
    GO
    ALTER TABLE T
    ADD sk int NOT NULL IDENTITY(1, 1) CONSTRAINT UQ_T_sk UNIQUE CLUSTERED,
    ITEM int NULL;
    GO
    SELECT * FROM T ORDER BY NUM_DOC;
    GO
    UPDATE T
    SET ITEM = (
      SELECT COUNT(*)
      FROM T AS T1
      WHERE T1.NUM_DOC = T.NUM_DOC AND T1.sk <= T.sk
      );
    GO
    ALTER TABLE T
    DROP CONSTRAINT UQ_T_sk;
    GO
    ALTER TABLE T
    DROP COLUMN sk;
    GO
    ALTER TABLE T
    ALTER COLUMN ITEM int NOT NULL;
    GO
    ALTER TABLE T
    ADD CONSTRAINT PK_T PRIMARY KEY (NUM_DOC, ITEM);
    GO
    SELECT * FROM T ORDER BY NUM_DOC, ITEM;
    GO
    DROP TABLE T;
    GO
    

    AMB

    Some guidelines for posting questions...

    jueves, 20 de enero de 2011 16:02