none
Consulta multitabla RRS feed

  • Pregunta

  • Buenas a todos, estoy trabajando en SQL Server 2014. Busco obtener una consulta donde me arroje los saldos por tipo de gasto... Tengo las siguientes 3 tablas

    TABLA DE SALDOS (POR PROGRAMAS)

    TABLA DE CATÁLOGO DE PROGRAMAS (AHÍ SE ENCUENTRA LIGADO AL ID DEL TIPO DE GASTO)

    TABLA DE TIPOS DE GASTO:

    BUSCO LO SIGUIENTE:

    OJALA PUEDAN AYUDARME, MUCHAS GRACIAS.

    lunes, 17 de septiembre de 2018 18:37

Respuestas

  • Hola AlvaroLanda:

    Puedes hacer algo del estilo.

    USE foros;
    GO
    CREATE TABLE tipoGasto
    (id_tipo_Gasto INT,
     tipo_gasto    VARCHAR(100)
    );
    GO
    INSERT INTO tipoGasto
    (id_tipo_Gasto,
     tipo_gasto
    )
    VALUES
    (1,
     'Gasto Corriente'
    ),
    (2,
     'Gasto de Capital'
    ),
    (3,
     'Amortización ...'
    ),
    (4,
     'Pensiones....'
    ),
    (5,
     'Participaciones'
    );
    GO
    CREATE TABLE Catalogo
    (id_programa   INT,
     id_tipo_gasto INT,
     programa      VARCHAR(100)
    );
    GO
    
    INSERT INTO Catalogo
    (id_programa,
     id_tipo_gasto,
     programa
    )
    VALUES
    (15,
     1,
     'Regiduría Sexta'
    ),
    (16,
     1,
     'Regiduría Septima'
    ),
    (17,
     1,
     'Regiduría Octava'
    ),
    (18,
     1,
     'Regiduría Novena'
    ),
    (19,
     1,
     'Regiduría Decima'
    ),
    (20,
     1,
     'Regiduría Decima Primera'
    ),
    (21,
     2,
     'DE TIPO GASTO 2'
    ),
    (22,
     3,
     'DE TIPO GASTO 3'
    )
    ;
    GO
    CREATE TABLE saldos
    (id           INT IDENTITY(1, 1),
     id_programa  INT,
     saldoEnero   FLOAT,
     saldoFebrero FLOAT,
     saldoMarzo   FLOAT,
     saldoAbril   FLOAT,
     saldoMayo    FLOAT
    );
    GO
    INSERT INTO saldos
    (id_programa,
     saldoEnero,
     saldoFebrero,
     saldoMarzo,
     saldoAbril,
     saldoMayo
    )
    VALUES
    (15,
     -7443261.12,
     10,
     10,
     10,
     10
    ),
    (15,
     20,
     20,
     20,
     20,
     20
    ),
    (15,
     20,
     20,
     20,
     20,
     20
    ),
    (15,
     20,
     20,
     20,
     20,
     20
    ),
    (15,
     30,
     30,
     03,
     03,
     30
    ),
    (15,
     40,
     0,
     0,
     0,
     0
    ),
    (15,
     0,
     50,
     0,
     0,
     0
    ),
    (16,
     0,
     0,
     60,
     0,
     0
    ),
    (16,
     0,
     0,
     0,
     70,
     0
    ),
    (16,
     0,
     0,
     0,
     0,
     80
    ),
    (16,
     0,
     0,
     0,
     09,
     0
    ),
    (16,
     0,
     0,
     09,
     0,
     0
    ),
    (17,
     0,
     09,
     0,
     0,
     0
    ),
    (17,
     30,
     0,
     0,
     0,
     30
    );
    GO
    
    SELECT t.tipo_gasto,
           S.id_programa,
           C.id_tipo_gasto,
           C.programa,
           SUM(saldoEnero) AS [SALDO ENERO],
           SUM(S.saldoFebrero) AS [SALDO FEBRERO],
           SUM(saldoMarzo) AS [SALDO MARZO],
           SUM(S.saldoAbril) AS [SALDO ABRIL],
           SUM(saldoMayo) AS [SALDO MAYO]
    FROM saldos s
         INNER JOIN Catalogo c ON s.id_programa = c.id_programa
         INNER JOIN tipoGasto t ON t.id_tipo_Gasto = c.id_tipo_gasto
    GROUP BY T.tipo_gasto,
             S.id_programa,
             C.id_tipo_gasto,
             C.programa;
    

    Si solo deseas las columnas que me has dado en la vista, entonces, tienes que quitar de la select las columnas id_programa, id_tipo_Gasto y programa, además de las mismas en la clausula group by

    Un saludo

    • Marcado como respuesta ÁlvaroLanda martes, 18 de septiembre de 2018 22:16
    lunes, 17 de septiembre de 2018 19:31

Todas las respuestas

  • Hola AlvaroLanda:

    Puedes hacer algo del estilo.

    USE foros;
    GO
    CREATE TABLE tipoGasto
    (id_tipo_Gasto INT,
     tipo_gasto    VARCHAR(100)
    );
    GO
    INSERT INTO tipoGasto
    (id_tipo_Gasto,
     tipo_gasto
    )
    VALUES
    (1,
     'Gasto Corriente'
    ),
    (2,
     'Gasto de Capital'
    ),
    (3,
     'Amortización ...'
    ),
    (4,
     'Pensiones....'
    ),
    (5,
     'Participaciones'
    );
    GO
    CREATE TABLE Catalogo
    (id_programa   INT,
     id_tipo_gasto INT,
     programa      VARCHAR(100)
    );
    GO
    
    INSERT INTO Catalogo
    (id_programa,
     id_tipo_gasto,
     programa
    )
    VALUES
    (15,
     1,
     'Regiduría Sexta'
    ),
    (16,
     1,
     'Regiduría Septima'
    ),
    (17,
     1,
     'Regiduría Octava'
    ),
    (18,
     1,
     'Regiduría Novena'
    ),
    (19,
     1,
     'Regiduría Decima'
    ),
    (20,
     1,
     'Regiduría Decima Primera'
    ),
    (21,
     2,
     'DE TIPO GASTO 2'
    ),
    (22,
     3,
     'DE TIPO GASTO 3'
    )
    ;
    GO
    CREATE TABLE saldos
    (id           INT IDENTITY(1, 1),
     id_programa  INT,
     saldoEnero   FLOAT,
     saldoFebrero FLOAT,
     saldoMarzo   FLOAT,
     saldoAbril   FLOAT,
     saldoMayo    FLOAT
    );
    GO
    INSERT INTO saldos
    (id_programa,
     saldoEnero,
     saldoFebrero,
     saldoMarzo,
     saldoAbril,
     saldoMayo
    )
    VALUES
    (15,
     -7443261.12,
     10,
     10,
     10,
     10
    ),
    (15,
     20,
     20,
     20,
     20,
     20
    ),
    (15,
     20,
     20,
     20,
     20,
     20
    ),
    (15,
     20,
     20,
     20,
     20,
     20
    ),
    (15,
     30,
     30,
     03,
     03,
     30
    ),
    (15,
     40,
     0,
     0,
     0,
     0
    ),
    (15,
     0,
     50,
     0,
     0,
     0
    ),
    (16,
     0,
     0,
     60,
     0,
     0
    ),
    (16,
     0,
     0,
     0,
     70,
     0
    ),
    (16,
     0,
     0,
     0,
     0,
     80
    ),
    (16,
     0,
     0,
     0,
     09,
     0
    ),
    (16,
     0,
     0,
     09,
     0,
     0
    ),
    (17,
     0,
     09,
     0,
     0,
     0
    ),
    (17,
     30,
     0,
     0,
     0,
     30
    );
    GO
    
    SELECT t.tipo_gasto,
           S.id_programa,
           C.id_tipo_gasto,
           C.programa,
           SUM(saldoEnero) AS [SALDO ENERO],
           SUM(S.saldoFebrero) AS [SALDO FEBRERO],
           SUM(saldoMarzo) AS [SALDO MARZO],
           SUM(S.saldoAbril) AS [SALDO ABRIL],
           SUM(saldoMayo) AS [SALDO MAYO]
    FROM saldos s
         INNER JOIN Catalogo c ON s.id_programa = c.id_programa
         INNER JOIN tipoGasto t ON t.id_tipo_Gasto = c.id_tipo_gasto
    GROUP BY T.tipo_gasto,
             S.id_programa,
             C.id_tipo_gasto,
             C.programa;
    

    Si solo deseas las columnas que me has dado en la vista, entonces, tienes que quitar de la select las columnas id_programa, id_tipo_Gasto y programa, además de las mismas en la clausula group by

    Un saludo

    • Marcado como respuesta ÁlvaroLanda martes, 18 de septiembre de 2018 22:16
    lunes, 17 de septiembre de 2018 19:31
  • Muchas gracias Javi, la consulta en efecto me arroja los saldos por tipo de gasto. Mi problema recae ahora en como mostrar todos los tipos de gasto aunque éstos no tengan presencia en la tabla de saldos, porque a este momento se me muestran los saldos de cada tipo de gasto que los programas tengan presencia en los saldos, es decir, si tengo 5 tipos de gasto en catálogo, pero solo 1 programa tiene saldo, la consulta solo me muestra el tipo de gasto de ese programa. Necesito me muestre todos los tipos de gasto de mi catálogo aunque los que no tengan presencia en la tabla de saldos se muestren con valor 0. Gracias

    lunes, 17 de septiembre de 2018 22:35
  • A priori cambia iiner join tipogasro por left join tipogasto. En vez de mostrar y agrupar c.tipogasto lo haces con t.tipogasto.

    Pruebalo y comentas

    martes, 18 de septiembre de 2018 4:57
  •  Cole la respuesta antes que tu pregunta. Aqui va lo de left join
    martes, 18 de septiembre de 2018 4:58
  • Al cambiar LEFT JOIN tipoGasto el resultado no cambió, me funcionó con RIGHT JOIN, pero me muestra NULL en id_tipo_gasto y en los saldos, los saldos puedo aplicarles  ISNULL() para validar y me arroje 0 por ejemplo, pero como hago para que en los que me arroja NULL en el id_tipo_gasto si me muestre el ID de su catálogo? Anexo imágen del resultado con RIGHT JOIN:

    martes, 18 de septiembre de 2018 15:33
  • Entonces cambia el idtipogasto tambien. Tanto en la select como en group by.

    Tiene que pertenecer a la misma tabla que tipogasto

    martes, 18 de septiembre de 2018 18:23
  • Muchas gracias, quedó perfecto. Un saludo
    • Editado ÁlvaroLanda martes, 18 de septiembre de 2018 18:33
    martes, 18 de septiembre de 2018 18:33
  • De nada
    martes, 18 de septiembre de 2018 19:00