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 ??????

Preguntas similare

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 ??????



Respuesta Responder a este mensaje
#2 Alejandro Mesa
20/03/2006 - 01:48 | Informe spam
Super,

Puedes usar las funciones "isnull" o "coalesce".

SUM(dbo.Detalle_Comprobante.Credito) AS Credito,



isnull(SUM(dbo.Detalle_Comprobante.Credito), 0) AS Credito,


AMB

"Super" wrote:

Gracias, ahora todo me sale perfecto, pero desearia saber algo mas, pues lo
inserté en un SP, pero ahora no se como poner que si el debito o credito es
NULL, tome valor cero

quedó de esta forma

CREATE PROCEDURE SGI_Resultado_Acumulado_Det

(
@hasta smalldatetime
)
AS

SELECT dbo.Cuentas.Cuenta, dbo.Cuentas.Subcuenta,
dbo.Cuentas.Descripcion, dbo.Naturaleza.Naturaleza AS nNaturaleza,
dbo.Clasificacion_Contable.Tipo,
dbo.Subclasificacion_Contable.Nombre, SUM(dbo.Detalle_Comprobante.Debito) AS
Debito,
SUM(dbo.Detalle_Comprobante.Credito) AS Credito,
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 AND dbo.Comproba.Contabilizado = 1 AND
dbo.Comproba.Fecha <= @hasta
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
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)
GO



Respuesta Responder a este mensaje
#3 Super
20/03/2006 - 05:32 | Informe spam
Gracias, ahora todo me sale perfecto, pero desearia saber algo mas, pues lo
inserté en un SP, pero ahora no se como poner que si el debito o credito es
NULL, tome valor cero

quedó de esta forma

CREATE PROCEDURE SGI_Resultado_Acumulado_Det

(
@hasta smalldatetime
)
AS

SELECT dbo.Cuentas.Cuenta, dbo.Cuentas.Subcuenta,
dbo.Cuentas.Descripcion, dbo.Naturaleza.Naturaleza AS nNaturaleza,
dbo.Clasificacion_Contable.Tipo,
dbo.Subclasificacion_Contable.Nombre, SUM(dbo.Detalle_Comprobante.Debito) AS
Debito,
SUM(dbo.Detalle_Comprobante.Credito) AS Credito,
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 AND dbo.Comproba.Contabilizado = 1 AND
dbo.Comproba.Fecha <= @hasta
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
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)
GO
Respuesta Responder a este mensaje
#4 Super
20/03/2006 - 13:54 | Informe spam
Gracias por su paciencia y su dedicación

Ahora tengo una duda mayor y disculpe tanta molestia, pero tengo dudas en
SQL
el SP es

CREATE PROCEDURE SGI_Resultado_Acumulado_Det

(
@hasta smalldatetime
)
AS

SELECT dbo.Cuentas.Cuenta, dbo.Cuentas.Subcuenta,
dbo.Cuentas.Descripcion, dbo.Naturaleza.Naturaleza AS nNaturaleza,
dbo.Clasificacion_Contable.Tipo,
dbo.Subclasificacion_Contable.Nombre, SUM(dbo.Detalle_Comprobante.Debito) AS
Debito,
SUM(dbo.Detalle_Comprobante.Credito) AS Credito,
dbo.Cuentas.Naturaleza AS Expr3, dbo.Cuentas.ClasificaCuenta,
dbo.Cuentas.SubClasificaCuenta,
dbo.Cuentas.UltimoNivel
FROM dbo.Comproba INNER JOIN
dbo.Detalle_Comprobante ON dbo.Comproba.Referencia =
dbo.Detalle_Comprobante.Referencia AND dbo.Comproba.Contabilizado = 1 AND
dbo.Comproba.Fecha <= @hasta
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
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, dbo.Cuentas.UltimoNivel
HAVING (dbo.Cuentas.ClasificaCuenta = 3) OR
(dbo.Cuentas.ClasificaCuenta = 4)

GO
como podria por ejemplo
la cuenta tiene cuenta, subcuenta, analisis y sus valores son

822
822 603
822 603 01
822 603 02
822 604
822 604 01
822 604 02

solo las ultimas (con 01 y 02) son de ultimo nivel, o sea, aparecerá en el
detalle pero necesito totalizar de la forma siguiente

822 603 con la suma del 01 y 02 correspondientes, teniendo en cuenta ademas
que si es deudora es (debito-credito) y si es acreedora es (credito-debito),
igual para 822 604 y luego la suma de los totales de esta ( 822 603 y 822
604) en la 822
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida