Select varias tablas

19/03/2006 - 11:57 por Super | Informe spam
Hola me gustaria lograr lo siguiente y no encuentro forma de hacerlo:
tengo una vista de la siguiente forma

SELECT TOP 100 PERCENT dbo.Cuentas.Cuenta, dbo.Cuentas.Subcuenta,
dbo.Cuentas.Descripcion, dbo.Naturaleza.Naturaleza,
dbo.Clasificacion_Contable.Tipo,
dbo.Subclasificacion_Contable.Nombre, SUM(dbo.Detalle_Comprobante.Debito) AS
Expr1,
SUM(dbo.Detalle_Comprobante.Credito) AS Expr2,
dbo.Cuentas.Naturaleza AS Expr3, dbo.Cuentas.ClasificaCuenta,
dbo.Cuentas.SubClasificaCuenta
FROM dbo.Comproba INNER JOIN
dbo.Detalle_Comprobante ON dbo.Comproba.Referencia =
dbo.Detalle_Comprobante.Referencia RIGHT OUTER JOIN
dbo.Cuentas INNER JOIN
dbo.Clasificacion_Contable ON
dbo.Cuentas.ClasificaCuenta = dbo.Clasificacion_Contable.Id INNER JOIN
dbo.Naturaleza ON dbo.Cuentas.Naturaleza =
dbo.Naturaleza.Id INNER JOIN
dbo.Subclasificacion_Contable ON
dbo.Cuentas.SubClasificaCuenta =
dbo.Subclasificacion_Contable.Subclasificacion ON
dbo.Detalle_Comprobante.Id_Cuenta =
dbo.Cuentas.Id_Cuenta
WHERE (dbo.Comproba.Contabilizado = 1)
GROUP BY dbo.Cuentas.Cuenta, dbo.Cuentas.Subcuenta, dbo.Cuentas.Descripcion,
dbo.Naturaleza.Naturaleza, dbo.Clasificacion_Contable.Tipo,
dbo.Subclasificacion_Contable.Nombre,
dbo.Cuentas.Naturaleza, dbo.Cuentas.ClasificaCuenta,
dbo.Cuentas.SubClasificaCuenta
HAVING (dbo.Cuentas.ClasificaCuenta = 3) OR
(dbo.Cuentas.ClasificaCuenta = 4)
ORDER BY dbo.Cuentas.ClasificaCuenta DESC

la tabla cuentas tiene todas las cuentas contables que se utilizan en
contabilidad y detalle de comprobante guarda las operaciones contables
contra diferentes cuentas, pero no tienen por que contabilizarse a todas las
cuantas del nomenclador, necesito que independientemente de ello salgan
todas las cuentas del nomenclador aunque no se hayan contabilizado contra
ellas, como lo hago ??????
 

Leer las respuestas

#1 Alejandro Mesa
19/03/2006 - 15:06 | Informe spam
Super,

La union atraves del operador logico "right outer join" debe dar el
resultado que esperas. Lo que pasa es que una vez que las unes, filtras el
resultado por:

WHERE (dbo.Comproba.Contabilizado = 1)



Para que esto no pase, en vez de filtar en la clausula "where
", usa la condicion como una parte de la union.
...
FROM
dbo.Comproba
INNER JOIN
dbo.Detalle_Comprobante
ON dbo.Comproba.Referencia = dbo.Detalle_Comprobante.Referencia
and dbo.Comproba.Contabilizado = 1
RIGHT OUTER JOIN
dbo.Cuentas
INNER JOIN
dbo.Clasificacion_Contable
ON dbo.Cuentas.ClasificaCuenta = dbo.Clasificacion_Contable.Id
INNER JOIN
dbo.Naturaleza
ON dbo.Cuentas.Naturaleza = dbo.Naturaleza.Id
INNER JOIN
dbo.Subclasificacion_Contable
ON dbo.Cuentas.SubClasificaCuenta =
dbo.Subclasificacion_Contable.Subclasificacion
ON dbo.Detalle_Comprobante.Id_Cuenta = dbo.Cuentas.Id_Cuenta
...

Ahora algunos consejos.

1 - Usa alias para las tablas y evitaras referencias largas en tus
expresiones, no es que esto sea malo pero ayuda en la legibilidad de la
sentencia

2 - Para que usas la clausula "order by" dentro de la vista?. Eso no tiene
ningun sentido puesto que cuando selecciones desde la vista, tendras que usar
nuevamente la clasula "order by" si quieres el resultado ordenado. SQL Server
no garantiza que el resultado este ordenado si no usas la clausula "order by"
en la sentencia "select" que devuelve el resultado. Asi que evita el uso de
"TOP 100 percent" y "order by" dentro de una vista.

select *
from tu_vista
order by ...


AMB

"Super" wrote:

Hola me gustaria lograr lo siguiente y no encuentro forma de hacerlo:
tengo una vista de la siguiente forma

SELECT TOP 100 PERCENT dbo.Cuentas.Cuenta, dbo.Cuentas.Subcuenta,
dbo.Cuentas.Descripcion, dbo.Naturaleza.Naturaleza,
dbo.Clasificacion_Contable.Tipo,
dbo.Subclasificacion_Contable.Nombre, SUM(dbo.Detalle_Comprobante.Debito) AS
Expr1,
SUM(dbo.Detalle_Comprobante.Credito) AS Expr2,
dbo.Cuentas.Naturaleza AS Expr3, dbo.Cuentas.ClasificaCuenta,
dbo.Cuentas.SubClasificaCuenta
FROM dbo.Comproba INNER JOIN
dbo.Detalle_Comprobante ON dbo.Comproba.Referencia =
dbo.Detalle_Comprobante.Referencia RIGHT OUTER JOIN
dbo.Cuentas INNER JOIN
dbo.Clasificacion_Contable ON
dbo.Cuentas.ClasificaCuenta = dbo.Clasificacion_Contable.Id INNER JOIN
dbo.Naturaleza ON dbo.Cuentas.Naturaleza =
dbo.Naturaleza.Id INNER JOIN
dbo.Subclasificacion_Contable ON
dbo.Cuentas.SubClasificaCuenta =
dbo.Subclasificacion_Contable.Subclasificacion ON
dbo.Detalle_Comprobante.Id_Cuenta =
dbo.Cuentas.Id_Cuenta
WHERE (dbo.Comproba.Contabilizado = 1)
GROUP BY dbo.Cuentas.Cuenta, dbo.Cuentas.Subcuenta, dbo.Cuentas.Descripcion,
dbo.Naturaleza.Naturaleza, dbo.Clasificacion_Contable.Tipo,
dbo.Subclasificacion_Contable.Nombre,
dbo.Cuentas.Naturaleza, dbo.Cuentas.ClasificaCuenta,
dbo.Cuentas.SubClasificaCuenta
HAVING (dbo.Cuentas.ClasificaCuenta = 3) OR
(dbo.Cuentas.ClasificaCuenta = 4)
ORDER BY dbo.Cuentas.ClasificaCuenta DESC

la tabla cuentas tiene todas las cuentas contables que se utilizan en
contabilidad y detalle de comprobante guarda las operaciones contables
contra diferentes cuentas, pero no tienen por que contabilizarse a todas las
cuantas del nomenclador, necesito que independientemente de ello salgan
todas las cuentas del nomenclador aunque no se hayan contabilizado contra
ellas, como lo hago ??????



Preguntas similares