Query rebuscado.... (SQL 2000)

25/02/2004 - 19:29 por Mercedes | Informe spam
Cuento con 3 Tablas
Tabla "A" es un catalogo autobuses
Tabla "B" son los gastos de los autobuses
Tabla "C" son los ingresos de los autobuses

Las 3 cuenta con campos como; Numero de Autobus, Region y
Marca
Las tablas B y C cuentan tambien con mes y año

Deseo seleccionar el catalogo los autobuses que
pertenescan a la Region 008 y Marca 02.
Compararlo con los Gastos e ingresos que pertenesca a la
Region 008, Marca 02, Mes 1, Año 2004
pero solo que me muestre los que NO estan en el catalogo.
Todo esto sin que se repita el número del autobus y que
incluya su gasto e ingreso

Ejemplo

Tabla "A"
NUM_BUS REGION MARCA
1 008 02
2 008 02
3 008 02
4 008 02
5 008 02

Tabla "B"
NBUS REGION MARCA MES AÑO GASTOS
1 008 02 1 2004 10
2 008 02 1 2004 20
7 008 02 1 2004 30
13 008 02 1 2004 40
...

Tabla "C"
NBUS REGION MARCA MES AÑO INGRESOS
4 008 02 1 2004 40
5 008 02 1 2004 50
9 008 02 1 2004 60
10 008 02 1 2004 70
7 008 02 1 2004 80
...

RESULTADO QUE QUIERO OBTENER: (ESTOS AUTOBUSES SON DE LA
MISMA REGION, MARCA, MES Y AÑO)
[Los autobuses del 1 al 5 no muestra por que estan en el
catalogo de autobuses]

NBUS GASTOS INGRESOS
7 30 80
13 40 0
9 0 60
10 0 70

NOTA: MIS TABLAS TIENE CADA UNA CERCA DE 80,000 REGISTRO Y
TIENDE A CRECER MUCHO MAS.

ME GUSTARIA HACER CONSULTAS OPTIMAS LO HE INTENTADO CON
JOIN CON IN CON EXIST Y NO ME QUEDA


GRACIAS POR SU APOYO...

Preguntas similare

Leer las respuestas

#1 Maximiliano D. A.
25/02/2004 - 19:38 | Informe spam
Hola!! veamos si esto te es util si?

Select tablab.autobus, sum(tablab.gaston) as gastos,ingresos.ingreso From
TablaB left join
(Select autobus,region,marca,año,sum(ingresos) ingreso From TablaC group by
autobus,region,marca,año) ingresos on
tablab.autobus = ingresos.autobus and
tablab.region = ingresos.region and
tablab.marca = ingresos.marca and
tablab.año = ingresos.año
group by tablab.autobus,ingresos.ingreso ,region,marca,año

Espero te sea util!! fijate como adaptarlo (ojo que no probe el codigo o sea
puede tener algun error de sintaxis)

Bye



Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"Mercedes" escribió en el mensaje
news:16d101c3fbcd$53295130$
Cuento con 3 Tablas
Tabla "A" es un catalogo autobuses
Tabla "B" son los gastos de los autobuses
Tabla "C" son los ingresos de los autobuses

Las 3 cuenta con campos como; Numero de Autobus, Region y
Marca
Las tablas B y C cuentan tambien con mes y año

Deseo seleccionar el catalogo los autobuses que
pertenescan a la Region 008 y Marca 02.
Compararlo con los Gastos e ingresos que pertenesca a la
Region 008, Marca 02, Mes 1, Año 2004
pero solo que me muestre los que NO estan en el catalogo.
Todo esto sin que se repita el número del autobus y que
incluya su gasto e ingreso

Ejemplo

Tabla "A"
NUM_BUS REGION MARCA
1 008 02
2 008 02
3 008 02
4 008 02
5 008 02

Tabla "B"
NBUS REGION MARCA MES AÑO GASTOS
1 008 02 1 2004 10
2 008 02 1 2004 20
7 008 02 1 2004 30
13 008 02 1 2004 40
...

Tabla "C"
NBUS REGION MARCA MES AÑO INGRESOS
4 008 02 1 2004 40
5 008 02 1 2004 50
9 008 02 1 2004 60
10 008 02 1 2004 70
7 008 02 1 2004 80
...

RESULTADO QUE QUIERO OBTENER: (ESTOS AUTOBUSES SON DE LA
MISMA REGION, MARCA, MES Y AÑO)
[Los autobuses del 1 al 5 no muestra por que estan en el
catalogo de autobuses]

NBUS GASTOS INGRESOS
7 30 80
13 40 0
9 0 60
10 0 70

NOTA: MIS TABLAS TIENE CADA UNA CERCA DE 80,000 REGISTRO Y
TIENDE A CRECER MUCHO MAS.

ME GUSTARIA HACER CONSULTAS OPTIMAS LO HE INTENTADO CON
JOIN CON IN CON EXIST Y NO ME QUEDA


GRACIAS POR SU APOYO...






Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 21/02/2004
Respuesta Responder a este mensaje
#2 Javier Loria
26/02/2004 - 13:30 | Informe spam
Hola Mercedes:
Gracias por los ejemplos, pero seria mejor DDL :(
Asumiendo:
/* Codigo de Creacion de Tablas */
/* e Insercion de Ejemplos */
CREATE TABLE Buses(
Num_Bus INT NOT NULL,
Region CHAR(3) NOT NULL,
CHECK(Region LIKE '[0-9][0-9][0-9]'),
Marca CHAR(2) NOT NULL
CHECK(Marca LIKE '[0-9][0-9]'),
CONSTRAINT PK_Buses
PRIMARY KEY(Num_Bus, Region, Marca)
)
CREATE TABLE Gastos(
Num_Bus INT NOT NULL,
Region CHAR(3),
CHECK(Region LIKE '[0-9][0-9][0-9]'),
Marca CHAR(2)
CHECK(Marca LIKE '[0-9][0-9]'),
Mes SMALLINT
CHECK (Mes>=1 AND Mes<),
Ano SMALLINT
CHECK (Ano> 00 AND Ano<!00),
MontoGastos DECIMAL(9,2)
CHECK (MontoGastos>0)
CONSTRAINT PK_Gastos
PRIMARY KEY(Num_Bus, Region, Marca, Ano, Mes)
)

CREATE TABLE Ingresos(
Num_Bus INT NOT NULL,
Region CHAR(3),
CHECK(Region LIKE '[0-9][0-9][0-9]'),
Marca CHAR(2)
CHECK(Marca LIKE '[0-9][0-9]'),
Mes SMALLINT
CHECK (Mes>=1 AND Mes<),
Ano SMALLINT
CHECK (Ano> 00 AND Ano<!00),
MontoIngresos DECIMAL(9,2)
CHECK (MontoIngresos>0)
CONSTRAINT PK_Ingresos
PRIMARY KEY(Num_Bus, Region, Marca, Ano, Mes)
)

INSERT Buses(Num_Bus, Region, Marca)
SELECT 1, '008', '02' UNION ALL
SELECT 2, '008', '02' UNION ALL
SELECT 3, '008', '02' UNION ALL
SELECT 4, '008', '02' UNION ALL
SELECT 5, '008', '02'

INSERT Gastos(Num_Bus, Region, Marca, Mes, Ano, MontoGastos)
SELECT 1, '008', '02', 1, 2004, 10 UNION ALL
SELECT 2, '008', '02', 1, 2004, 20 UNION ALL
SELECT 7, '008', '02', 1, 2004, 30 UNION ALL
SELECT 13, '008', '02', 1, 2004, 40

INSERT Ingresos(Num_Bus, Region, Marca, Mes, Ano, MontoIngresos)
SELECT 4, '008', '02', 1, 2004, 40 UNION ALL
SELECT 5, '008', '02', 1, 2004, 50 UNION ALL
SELECT 9, '008', '02', 1, 2004, 60 UNION ALL
SELECT 10, '008', '02', 1, 2004, 70 UNION ALL
SELECT 7, '008', '02', 1, 2004, 80
/* Fin de Creacion de Tablas */

El SELECT debe ser algo como esto:
/* Ingresos y Gastos de los NO Buses */
SELECT COALESCE(Gastos.Num_Bus, Ingresos.Num_Bus)
, COALESCE(Gastos.Region , Ingresos.Region)
, COALESCE(Gastos.Marca , Ingresos.Marca)
, COALESCE(Gastos.Mes , Ingresos.Mes)
, COALESCE(Gastos.Ano , Ingresos.Ano)
, COALESCE(Gastos.MontoGastos, 0)
, COALESCE(Ingresos.MontoIngresos, 0)
FROM Gastos
FULL OUTER JOIN INGRESOS
ON Gastos.Num_Bus=Ingresos.Num_Bus
AND Gastos.Region=Ingresos.Region
AND Gastos.Marca=Ingresos.Marca
AND Gastos.Mes=Ingresos.Mes
AND Gastos.Ano=Ingresos.Ano
LEFT JOIN BUSES
ON COALESCE(Gastos.Num_Bus, Ingresos.Num_Bus)=Buses.Num_Bus
AND COALESCE(Gastos.Region , Ingresos.Region)=Buses.Region
AND COALESCE(Gastos.Marca , Ingresos.Marca)=Buses.Marca
WHERE Buses.Num_Bus IS NULL

/* Fin de SELECT */
Claro que me quedan serias dudas sobre que son estos NO Buses.
Me parece que 80,000 filas no deberian ser mayor problema para esta
consulta, pero puedes probarla y ver si da el resultado deseado y si el
desempeno no es malo.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.


Mercedes escribio:
Cuento con 3 Tablas
Tabla "A" es un catalogo autobuses
Tabla "B" son los gastos de los autobuses
Tabla "C" son los ingresos de los autobuses

Las 3 cuenta con campos como; Numero de Autobus, Region y
Marca
Las tablas B y C cuentan tambien con mes y año

Deseo seleccionar el catalogo los autobuses que
pertenescan a la Region 008 y Marca 02.
Compararlo con los Gastos e ingresos que pertenesca a la
Region 008, Marca 02, Mes 1, Año 2004
pero solo que me muestre los que NO estan en el catalogo.
Todo esto sin que se repita el número del autobus y que
incluya su gasto e ingreso

Ejemplo

Tabla "A"
NUM_BUS REGION MARCA
1 008 02
2 008 02
3 008 02
4 008 02
5 008 02

Tabla "B"
NBUS REGION MARCA MES AÑO GASTOS
1 008 02 1 2004 10
2 008 02 1 2004 20
7 008 02 1 2004 30
13 008 02 1 2004 40
...

Tabla "C"
NBUS REGION MARCA MES AÑO INGRESOS
4 008 02 1 2004 40
5 008 02 1 2004 50
9 008 02 1 2004 60
10 008 02 1 2004 70
7 008 02 1 2004 80
...

RESULTADO QUE QUIERO OBTENER: (ESTOS AUTOBUSES SON DE LA
MISMA REGION, MARCA, MES Y AÑO)
[Los autobuses del 1 al 5 no muestra por que estan en el
catalogo de autobuses]

NBUS GASTOS INGRESOS
7 30 80
13 40 0
9 0 60
10 0 70

NOTA: MIS TABLAS TIENE CADA UNA CERCA DE 80,000 REGISTRO Y
TIENDE A CRECER MUCHO MAS.

ME GUSTARIA HACER CONSULTAS OPTIMAS LO HE INTENTADO CON
JOIN CON IN CON EXIST Y NO ME QUEDA


GRACIAS POR SU APOYO...
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida