none
Sumar dos columnas en PIVOT SQL para obtener saldos RRS feed

  • Pregunta

  • Hola a todos,

    Estoy haciendo una consulta para encontrar el Saldo de la columna "VALOR1" y necesito incluir el saldo de la Columna VALOR2 en el mismo PIVOT 

    DECLARE @TABLE_TMP AS TABLE 
    (VALOR1 INT, VALOR2 INT, SIGNO NVARCHAR(1))

    INSERT INTO @TABLE_TMP VALUES (100, 210, 'D')
    INSERT INTO @TABLE_TMP VALUES (110, 220, 'D')
    INSERT INTO @TABLE_TMP VALUES (210, 340, 'C')
    INSERT INTO @TABLE_TMP VALUES (410, 230, 'C')
    INSERT INTO @TABLE_TMP VALUES (50, 9210, 'C')

    SELECT ISNULL([C], 0) - ISNULL([D], 0) SALDO1
       FROM (
    SELECT VALOR1, SIGNO FROM @TABLE_TMP M
       ) M
    PIVOT( SUM(VALOR1) FOR SIGNO IN ([C], [D])) AS PT

    Alguien me podría dar una idea, 

     

    Carlos Pelaez

    viernes, 29 de enero de 2021 22:30

Todas las respuestas

  • Hola Carlos Pelaez:

    Puedes hacer una trasposición de columnas:

    DECLARE @TABLE_TMP AS TABLE 
    (VALOR1 INT, VALOR2 INT, SIGNO NVARCHAR(1))
    
    INSERT INTO @TABLE_TMP VALUES (100, 210, 'D')
    INSERT INTO @TABLE_TMP VALUES (110, 220, 'D')
    INSERT INTO @TABLE_TMP VALUES (210, 340, 'C')
    INSERT INTO @TABLE_TMP VALUES (410, 230, 'C')
    INSERT INTO @TABLE_TMP VALUES (50, 9210, 'C')
    
    SELECT SUM(CASE WHEN SIGNO = 'C' THEN VALOR1 END) AS C,
    	   SUM(CASE WHEN SIGNO = 'D' THEN VALOR2 END) AS D
    FROM @TABLE_TMP T
    


    sábado, 30 de enero de 2021 5:57
  • Hola Javi

    No, Porque lo que estoy es buscando es restar los elementos de C - Elementos de D pero de la Columna VALOR2, asi como esta para VALOR1 pero en el mismo Query 

    DECLARE @TABLE_TMP AS TABLE 
    (VALOR1 INT, VALOR2 INT, SIGNO NVARCHAR(1))

    INSERT INTO @TABLE_TMP VALUES (100, 210, 'D')
    INSERT INTO @TABLE_TMP VALUES (110, 220, 'D')
    INSERT INTO @TABLE_TMP VALUES (210, 340, 'C')
    INSERT INTO @TABLE_TMP VALUES (410, 230, 'C')
    INSERT INTO @TABLE_TMP VALUES (50, 9210, 'C')

    SELECT ISNULL([C], 0) - ISNULL([D], 0) SALDO1
       FROM (
    SELECT VALOR1, SIGNO FROM @TABLE_TMP M
       ) M
    PIVOT( SUM(VALOR1) FOR SIGNO IN ([C], [D])) AS PT

      


    Carlos Pelaez

    sábado, 30 de enero de 2021 8:57
  • Hola Carlos Pelaez:

    Perdona, pero para aclararlo, porque no pones el resultado esperado para la entrada expuesta.

    Número de columnas y valor de salida.

    He visto que me habías respondido ya el sábado (porque aparecía mencionado ultima respuesta), pero la web no me mostraba el mensaje hasta hace 5 minutos.

    Gracias

    lunes, 1 de febrero de 2021 11:43
  • Hola Javi, gracias por tu interés 

    El Query en mención produce una resta del campo VALOR1 marcados con "D" (menos)  Campos marcados con "C" , mi necesidad es esta misma operación pero al tiempo del campo VALOR2 en el mismo query. 

    SALDO1 = 460 - Resultado

    SALDO2 = 9350 

    Muchas Gracias

    Carlos Pelaez


    martes, 2 de febrero de 2021 13:39
  • Hola Carlos Pelaez:

    Utilizar un doble pivot es posible pero muy complicado.

    La solución más simple, es como te avance en la otra entrada, trasponer filas, pero luego puedes utilizar una tabla derivada.

    DECLARE @TABLE_TMP AS TABLE 
    (VALOR1 INT, VALOR2 INT, SIGNO NVARCHAR(1))
    
    INSERT INTO @TABLE_TMP VALUES (100, 210, 'D')
    INSERT INTO @TABLE_TMP VALUES (110, 220, 'D')
    INSERT INTO @TABLE_TMP VALUES (210, 340, 'C')
    INSERT INTO @TABLE_TMP VALUES (410, 230, 'C')
    INSERT INTO @TABLE_TMP VALUES (50, 9210, 'C')
    
    Select (d.valor1ParaC - d.valor1ParaD) as res1, (d.valor2ParaC - d.valor2ParaD) as res2
    From (
    SELECT SUM(CASE WHEN SIGNO = 'C' THEN valor1 END) AS valor1ParaC,
    	   SUM(CASE WHEN SIGNO = 'D' THEN valor1 END) AS valor1ParaD,
    	   SUM(CASE WHEN SIGNO = 'C' THEN valor2 END) AS valor2ParaC,
    	   SUM(CASE WHEN SIGNO = 'D' THEN valor2 END) AS valor2ParaD
    FROM @TABLE_TMP T
    ) as d
    

    La gracia, está en utilizar SUM con case para evaluar los resultados de lo que necesitamos sumar. Esto dentro del conjunto interior, que yo he llamado como D.

    Luego en el conjunto exterior con los datos, ya hacemos la operación que cada resultado nos da.

    Tablas derivadas

    https://javifer2.wordpress.com/2019/11/06/tabla-derivada/

    Nota: Perdona por la tardanza, pero algo le pasa a este hilo, que no veo las respuestas, que anotas. Para la de hoy, he tenido que acceder desde el foro de msdn y desde el registro de tú actividad, porque en el foro del technet veo que has escrito porque tú respuesta es la última del hilo, pero no veo su contenido.

    martes, 2 de febrero de 2021 15:15
  • Hola Javi, gracias por tu interés 

    La operación original arroja una resta de los campos marcados con D menos los campos marcados con C de la columna VALOR1, mi necesidad es hacer la misma operación en el mismo query de la columna VALOR2, produciendo SALDO2.

    SALDO1 = 460

    SALDO2 = 9350 * Esto seria lo nuevo 

    Gracias 


    Carlos Pelaez

    martes, 2 de febrero de 2021 18:53
  • Excelente respuesta Javi...Gracias 

    Carlos Pelaez

    martes, 2 de febrero de 2021 19:07