Principales respuestas
Consulta multitabla

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.
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 byUn saludo
- Marcado como respuesta ÁlvaroLanda martes, 18 de septiembre de 2018 22:16
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 byUn saludo
- Marcado como respuesta ÁlvaroLanda martes, 18 de septiembre de 2018 22:16
-
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
-
-
-
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:
-
-
Muchas gracias, quedó perfecto. Un saludo
- Editado ÁlvaroLanda martes, 18 de septiembre de 2018 18:33
-