none
Funcion para quitar filas con cifras negativas RRS feed

  • Pregunta

  • Tengo una consulta para crear un informe
    El informe se compone por varios campos, entre ellos (folio, curp, superficie y monto); un folio puede tener varios curp. La consulta como esta construida ahorita agrupa por folio y curp para hacer la sumatoria de los campos superficie y monto. Sin embargo hay registros negativos en la BD, lo cual no causa problema, sin embargo me piden que al presentar el informe 'quite' esos registros negativos. No puedo simplemente quitarlos ya que al hacer la sumatoria final se vería afectada sin esos negativos.

    Como podría restar esos negativos a algún otro registro que tenga la misma o mayor superficie, para así no presentar negativos, y la sumatoria final tampoco se vea afectada. Sin importar que la CURP sea diferente a la original.

    Si me pudieran dar un poco de idea de como lograr esa consulta

    Gracias
    martes, 21 de agosto de 2018 0:23

Respuestas

  • Hola ViridianaB:

    Puedes extraer la información en una tabla de expresión común, y en ella realizas las sumas necesarias pero luego de esta filtras los datos.

    Ejemplo:

    DECLARE @table TABLE
    (id         INT IDENTITY(1, 1),
     folio      INT,
     curp       INT,
     superficie INT,
     monto      INT
    );
    INSERT INTO @table
    (folio,
     curp,
     superficie,
     monto
    )
    VALUES
    (1, 1, 1, 10),
    (2, 1, 1, 10),
    (3, 1, 3, -10),
    (2, 1, 4, 10),
    (1, 1, 1, -10),
    (4, 1, 1, 10),
    (1, 1, 1, 10),
    (1, 1, 1, 10)
    /* fin de la preparación del escenario */
    ;
    WITH cte
         AS (
         SELECT id,
                folio,
                curp,
                superficie,
                monto,
                SUM(monto) OVER(PARTITION BY folio ORDER BY folio) AS sumatorio
         FROM @table)
         SELECT *
         FROM cte
         WHERE monto > 0
         ORDER BY id;
    	

    Un saludo

    martes, 21 de agosto de 2018 4:00
  • Estimada ViridianaB

    Creo que eso era lo que te había dado.

    DECLARE @table TABLE
    (id         INT IDENTITY(1, 1),
     folio      INT,
     curp       varchar(20),
     superficie float,
     monto      float
    );
    INSERT INTO @table
    (folio,
     curp,
     superficie,
     monto
    )
    VALUES
    (1612 ,'ROCE760320MSLDRM02', -20, -7212.38), 
    (1612 ,'VIHC960903HSLZRR05', -20, -7212.38), 
    (1612 ,'EAHJ741024HSLSRL08', -17, -6130.52), 
    (1612 ,'TOVL801017HSLRLS05', -8.37, -3018.38), 
    (1612 ,'LESH480201HSLYLC04', -5.1, -1839.16), 
    (1612 ,'AUMC400415HSLNDN05', -4, -1442.48), 
    (1612 ,'LERI640703MDGNYR04', 19.18, 6847.41), 
    (1612 ,'BARA740301HSLRNL02', 19.84, 7154.68), 
    (1612 ,'AEBB600119MSRRRL03', 20, 5071.48), 
    (1612 ,'LOAV840108HSLPYN06', 20, 7212.39), 
    (1612 ,'JIBA850214HSLMRN05', 20, 7212.38), 
    (1612 ,'LOVM670729MSLPLR09', 20, 7212.38), 
    (1612 ,'MAAE880430HSLRVM05', 20, 7212.38), 
    (1612 ,'LERR690607HSLNYB03', 20.2, 7211.55), 
    (1612 ,'BOPL940327HSRBLS09', 30, 7650.54 )
    
    
    
    /* fin de la preparación del escenario */
    ;
    WITH cte
         AS (
         SELECT id,
                folio,
                curp,
                superficie,
                monto,
                SUM(monto) OVER(PARTITION BY folio ORDER BY folio) AS sumatorio_monto,
    			sum(superficie) over (partition by folio order by folio ) as sumatorio_Superficie
         FROM @table)
         SELECT *
         FROM cte
         WHERE monto > 0
         ORDER BY id;
    	

    Salida:

    De la salida, se han eliminado las filas que tenían en monto un valor negativo, pero el sumatorio_monto y el sumatorio_superficie (añadido en esta consulta), son del global.

    ¿Es esta tu salida esperada? (obviando las columnas que no quieras mostrar)

    Un saludo

    miércoles, 22 de agosto de 2018 5:40

Todas las respuestas

  • Hola ViridianaB:

    Puedes extraer la información en una tabla de expresión común, y en ella realizas las sumas necesarias pero luego de esta filtras los datos.

    Ejemplo:

    DECLARE @table TABLE
    (id         INT IDENTITY(1, 1),
     folio      INT,
     curp       INT,
     superficie INT,
     monto      INT
    );
    INSERT INTO @table
    (folio,
     curp,
     superficie,
     monto
    )
    VALUES
    (1, 1, 1, 10),
    (2, 1, 1, 10),
    (3, 1, 3, -10),
    (2, 1, 4, 10),
    (1, 1, 1, -10),
    (4, 1, 1, 10),
    (1, 1, 1, 10),
    (1, 1, 1, 10)
    /* fin de la preparación del escenario */
    ;
    WITH cte
         AS (
         SELECT id,
                folio,
                curp,
                superficie,
                monto,
                SUM(monto) OVER(PARTITION BY folio ORDER BY folio) AS sumatorio
         FROM @table)
         SELECT *
         FROM cte
         WHERE monto > 0
         ORDER BY id;
    	

    Un saludo

    martes, 21 de agosto de 2018 4:00
  • Creo que no me di a entender 

    Debo de restarle esos negativos a algún número positivo que sea mayor o igual, todo eso sin dejar de agrupar por folio y curp. Ya que el informe que presento va el folio de la solicitud y la CURP de la persona.

    folio curp Super Monto
    1612 ROCE760320MSLDRM02 -20 -7212.38
    1612 VIHC960903HSLZRR05 -20 -7212.38
    1612 EAHJ741024HSLSRL08 -17 -6130.52
    1612 TOVL801017HSLRLS05 -8.37 -3018.38
    1612 LESH480201HSLYLC04 -5.1 -1839.16
    1612 AUMC400415HSLNDN05 -4 -1442.48
    1612 LERI640703MDGNYR04 19.18 6847.41
    1612 BARA740301HSLRNL02 19.84 7154.68
    1612 AEBB600119MSRRRL03 20 5071.48
    1612 LOAV840108HSLPYN06 20 7212.39
    1612 JIBA850214HSLMRN05 20 7212.38
    1612 LOVM670729MSLPLR09 20 7212.38
    1612 MAAE880430HSLRVM05 20 7212.38
    1612 LERR690607HSLNYB03 20.2 7211.55
    1612 BOPL940327HSRBLS09 30 7650.54

    Esos son algunos de los registros que me da mi consulta. Debo de restar esos negativos a algún otro registro, para así quitar los registros que no sean positivos, sin afectar la sumatoria final (Superficie: 114.75, Monto: 35,929.89). Si quito solo nos negativos a través de un filtro la sumatoria queda en Super: 189.22, Monto: 62,785.19

    Gracias
    martes, 21 de agosto de 2018 15:32
  • Estimada ViridianaB

    Creo que eso era lo que te había dado.

    DECLARE @table TABLE
    (id         INT IDENTITY(1, 1),
     folio      INT,
     curp       varchar(20),
     superficie float,
     monto      float
    );
    INSERT INTO @table
    (folio,
     curp,
     superficie,
     monto
    )
    VALUES
    (1612 ,'ROCE760320MSLDRM02', -20, -7212.38), 
    (1612 ,'VIHC960903HSLZRR05', -20, -7212.38), 
    (1612 ,'EAHJ741024HSLSRL08', -17, -6130.52), 
    (1612 ,'TOVL801017HSLRLS05', -8.37, -3018.38), 
    (1612 ,'LESH480201HSLYLC04', -5.1, -1839.16), 
    (1612 ,'AUMC400415HSLNDN05', -4, -1442.48), 
    (1612 ,'LERI640703MDGNYR04', 19.18, 6847.41), 
    (1612 ,'BARA740301HSLRNL02', 19.84, 7154.68), 
    (1612 ,'AEBB600119MSRRRL03', 20, 5071.48), 
    (1612 ,'LOAV840108HSLPYN06', 20, 7212.39), 
    (1612 ,'JIBA850214HSLMRN05', 20, 7212.38), 
    (1612 ,'LOVM670729MSLPLR09', 20, 7212.38), 
    (1612 ,'MAAE880430HSLRVM05', 20, 7212.38), 
    (1612 ,'LERR690607HSLNYB03', 20.2, 7211.55), 
    (1612 ,'BOPL940327HSRBLS09', 30, 7650.54 )
    
    
    
    /* fin de la preparación del escenario */
    ;
    WITH cte
         AS (
         SELECT id,
                folio,
                curp,
                superficie,
                monto,
                SUM(monto) OVER(PARTITION BY folio ORDER BY folio) AS sumatorio_monto,
    			sum(superficie) over (partition by folio order by folio ) as sumatorio_Superficie
         FROM @table)
         SELECT *
         FROM cte
         WHERE monto > 0
         ORDER BY id;
    	

    Salida:

    De la salida, se han eliminado las filas que tenían en monto un valor negativo, pero el sumatorio_monto y el sumatorio_superficie (añadido en esta consulta), son del global.

    ¿Es esta tu salida esperada? (obviando las columnas que no quieras mostrar)

    Un saludo

    miércoles, 22 de agosto de 2018 5:40