Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-03-2011
nejamube nejamube is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 65
Poder: 15
nejamube Va por buen camino
Thumbs up Firebird - Subconsulta con datos a la derecha

Hola a todos.

Necesito hacer una consulta en Firebird 2.5, he intentado de muchas formas y no logro lo que necesito.


Lo que deseo hacer, es que en una misma consulta puede obtener estos datos pero con la fecha de un mes anterior.

El resultado del mes anterior es para tomarlo como Saldo inicial del mes actual.

Esta es la consulta, pero falta agregar los datos de esta misma consulta con un mes anterior.

Cuando intente con subconsultas me muestra el mensaje "multiple rows in singleton select", por lo que supongo que no se pueden mostrar multiples datos de la subsonsulta, pero no estoy muy seguro.

Lo que deseo es que los datos de la subsonsulta aparezcan a la derecha de la primera consulta y no en la misma columna.


Código SQL [-]
select A.NOMBRE, U.NOMBRE UNIDAD, C.NOMBRE CATEGORIA, cast(sum(E.IMPORTE) as float) IMPORTEENTRADA,
       cast(sum(E.CANTIDAD) as integer) CANTIDADENTRADA, cast(sum(S.IMPORTE) as float) IMPORTESALIDA, cast(sum(S.CANTIDAD) as integer) CANTIDASALIDA

from ARTICULOS A
left join NOTASCREDITO E on E.ARTICULO = A.CLAVE
left join SALIDAS S on S.ENTRADA = E.CLAVE
left join CATEGORIAS C on A.CATEGORIA = C.CLAVE
left join UNIDADES U on A.UNIDAD = U.CLAVE

where (S.FECHA between :INICIAL and :FINAL) or (E.FECHA between :INICIAL and :FINAL)

group by C.NOMBRE, A.NOMBRE, U.NOMBRE


Hojala alguien me pueda ayudar.

Muchas gracias.
Responder Con Cita
  #2  
Antiguo 09-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Sí que debes de hacerlo con Subconsultas, pero te debes de asegurar que el resultado que devuelva esa subconsulta sea único, es decir, un único registro.

Si lo que deseas es calcular el saldo del mes anterior para cada registro, deberás de asegurarte que la subconsulta sólo te devuelva ese valor como un único número. Todos los demás datos podrás sacarlos del Select principal.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 09-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
No he probado este Select pero debes de hacer algó así como esto ;

Código SQL [-]
Select A.NOMBRE, U.NOMBRE UNIDAD, C.NOMBRE CATEGORIA,
       cast(sum(E.IMPORTE) as float) IMPORTEENTRADA,
       cast(sum(E.CANTIDAD) as integer) CANTIDADENTRADA,
       cast(sum(S.IMPORTE) as float) IMPORTESALIDA,
       cast(sum(S.CANTIDAD) as integer) CANTIDASALIDA,
 
(Select cast(sum(E2.IMPORTE as float)
 from ARTICULOS A2
 left join NOTASCREDITO E2 on E2.ARTICULO = A2.CLAVE
 where A2.CLAVE = A.CLAVE
 and E2.FECHA between :INIMESANTERIORL and :FINMESANTERIOR) as IMPENT_MESANTERIOR,
 
(Select cast(sum(S2.IMPORTE as float)
 from ARTICULOS A2
 left join SALIDAS S2 on S2.ENTRADA = A2.CLAVE
 where A2.CLAVE = A.CLAVE
 and S2.FECHA between :INIMESANTERIOR and :FINMESANTERIOR) as IMPSAL_MESANTERIOR
 
from ARTICULOS A
left join NOTASCREDITO E on E.ARTICULO = A.CLAVE
left join SALIDAS S      on S.ENTRADA = E.CLAVE
left join CATEGORIAS C   on A.CATEGORIA = C.CLAVE
left join UNIDADES U     on A.UNIDAD = U.CLAVE
 
where (S.FECHA between :INICIAL and :FINAL) or (E.FECHA between :INICIAL and :FINAL)
group by C.NOMBRE, A.NOMBRE, U.NOMBRE
__________________
Piensa siempre en positivo !
Responder Con Cita
  #4  
Antiguo 09-03-2011
nejamube nejamube is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 65
Poder: 15
nejamube Va por buen camino
Thumbs up Multiple rows in singleton select.

Gracias por tu respuesta gluglu.

Lo que deseo es calcular el saldo del mes anterior para cada registro.

Pero no entendi bien lo que me dices:

"Deberás de asegurarte que la subconsulta sólo te devuelva ese valor como un único número. Todos los demás datos podrás sacarlos del Select principal."

Si intento obtener la informacion de cada uno de los registros con la consulta que me dices, me muestra el mensaje "Multiple rows in singleton select".

Si la base de datos solo contiene un registro, la consulta muestra el mismo valor para articulos diferentes.


Código SQL [-]
select A.NOMBRE, U.NOMBRE UNIDAD, C.NOMBRE CATEGORIA, cast(sum(E.IMPORTE) as float) IMPORTEENTRADA,
       cast(sum(E.CANTIDAD) as integer) CANTIDADENTRADA, cast(sum(S.IMPORTE) as float) IMPORTESALIDA,
       cast(sum(S.CANTIDAD) as integer) CANTIDASALIDA,

       (select cast(sum(EN.IMPORTE) as float) IMPORTEENTRADA
        from NOTASCREDITO EN
        left outer join ARTICULOS AR on (EN.ARTICULO = AR.CLAVE)

        where ((EN.FECHA between :INIMESANTERIOR and :FINMESANTERIOR))
        group by AR.NOMBRE) as IMPENT_MESANTERIOR,

       (select cast(sum(S2.IMPORTE) as float)
        from ARTICULOS A2
        left join SALIDAS S2 on S2.ENTRADA = A2.CLAVE
        where ((S2.FECHA between :INIMESANTERIOR and :FINMESANTERIOR))
        group by A2.NOMBRE) as IMPSAL_MESANTERIOR

from ARTICULOS A
left join NOTASCREDITO E on E.ARTICULO = A.CLAVE
left join SALIDAS S on S.ENTRADA = E.CLAVE
left join CATEGORIAS C on A.CATEGORIA = C.CLAVE
left join UNIDADES U on A.UNIDAD = U.CLAVE

where (S.FECHA between :INICIAL and :FINAL) or (E.FECHA between :INICIAL and :FINAL)
group by C.NOMBRE, A.NOMBRE, U.NOMBRE

¿Es esta la forma apropiada de hacerla (subconsulta) ?, o ¿seria recomendable hacerlo de alguna otra?.

La consulta es para obtener los saldos iniciales del mes actual, que siempre son las existencias finales del mes anterior, todo esto utilizando el metodo de valuacion de inventarios PEPS.
Muchas gracias.
Responder Con Cita
  #5  
Antiguo 09-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
La subconsulta que quieres hacer, entiendo yo, es para devolverte un valor determinado para cada registro de la consulta principal.

Pues lo que tienes que hacer es pedir ese valor para cada registro de los que devuelve la consulta principal.

Tu consulta principal
Código SQL [-]
Select A.NOMBRE, U.NOMBRE UNIDAD, C.NOMBRE CATEGORIA, cast(sum(E.IMPORTE) as float) IMPORTEENTRADA,
       cast(sum(E.CANTIDAD) as integer) CANTIDADENTRADA, cast(sum(S.IMPORTE) as float) IMPORTESALIDA, cast(sum(S.CANTIDAD) as integer) CANTIDASALIDA

from ARTICULOS A
left join NOTASCREDITO E on E.ARTICULO = A.CLAVE
left join SALIDAS S on S.ENTRADA = E.CLAVE
left join CATEGORIAS C on A.CATEGORIA = C.CLAVE
left join UNIDADES U on A.UNIDAD = U.CLAVE

where (S.FECHA between :INICIAL and :FINAL) or (E.FECHA between :INICIAL and :FINAL)

group by C.NOMBRE, A.NOMBRE, U.NOMBRE

te devuelve los valores que quieres. Ahora, adicionalmente, tienes que añadirle la petición de datos del mes anterior a la consulta actual. Entiendo que la clave principal del fichero Articulos es A.CLAVE.

Lo que creo que quieres es obtener otros valores para esa CLAVE del fichero ARTICULOS, no ?

El error que mencionabas en tu primer post es porque la 'subconsulta' que habías intentado en un principio te devuelve resultados múltiples, varios registros, y esto Firebird no lo permite. Por otro lado, la subconsulta va a tomar los datos de referencia de la consulta principal.

La verdad es que hice el Select que posté a la rápida y no me dí cuenta de algunas cosas. Este está más afinado ....

Código SQL [-]
Select A.CLAVE, A.NOMBRE, U.NOMBRE UNIDAD, C.NOMBRE CATEGORIA,
       cast(sum(E.IMPORTE) as float) IMPORTEENTRADA,
       cast(sum(E.CANTIDAD) as integer) CANTIDADENTRADA,
       cast(sum(S.IMPORTE) as float) IMPORTESALIDA,
       cast(sum(S.CANTIDAD) as integer) CANTIDASALIDA,
 
(Select cast(sum(E2.IMPORTE as float) from NOTASCREDITO E2
 where E2.ARTICULO = A.CLAVE
 and E2.FECHA between :INIMESANTERIORL and :FINMESANTERIOR) as IMPENT_MESANTERIOR,
 
(Select cast(sum(S2.IMPORTE as float) from NOTASCREDITO E2
 left join SALIDAS S2 on S2.ENTRADA = E2.CLAVE
 where E2.ARTICULO = A.CLAVE
 and S2.FECHA between :INIMESANTERIOR and :FINMESANTERIOR) as IMPSAL_MESANTERIOR
 
from ARTICULOS A
left join NOTASCREDITO E on E.ARTICULO = A.CLAVE
left join SALIDAS S      on S.ENTRADA = E.CLAVE
left join CATEGORIAS C   on A.CATEGORIA = C.CLAVE
left join UNIDADES U     on A.UNIDAD = U.CLAVE
 
where (S.FECHA between :INICIAL and :FINAL) or (E.FECHA between :INICIAL and :FINAL)
 
group by A.CLAVE, C.NOMBRE, A.NOMBRE, U.NOMBRE

La consulta principal está igual que tu la has planteado al principio.

Te muestro el ejemplo para que además obtengas dos valores adicionales para cada registro de tu consulta principal, que corresponden con cada una de las subconsultas expuestas.

La primera subconsulta
Código SQL [-]
(Select cast(sum(E2.IMPORTE as float) from NOTASCREDITO E2
 where E2.ARTICULO = A.CLAVE
 and E2.FECHA between :INIMESANTERIORL and :FINMESANTERIOR) as IMPENT_MESANTERIOR,
coge el valor A.CLAVE directamente de la consulta principal para buscar el valor que corresponda en NOTASCREDITO dentro del margen de fechas que desees. El nombre de la columna, IMPENT_MESANTERIOR se coloca al final, fuera de la subconsulta.

La segunda subconsulta es un pco más compleja :
Código SQL [-]
(Select cast(sum(S2.IMPORTE as float) from NOTASCREDITO E2
 left join SALIDAS S2 on S2.ENTRADA = E2.CLAVE
 where E2.ARTICULO = A.CLAVE
 and S2.FECHA between :INIMESANTERIOR and :FINMESANTERIOR) as IMPSAL_MESANTERIOR
Ya que no hay una referencia directa en SALIDAS a la CLAVE en ARTICULO, por lo que he podido ver en tu consulta principal, hace falta pasar por NOTASCREDITO previamente, así que la suma se hará sobre S2.IMPORTE, habiendo previamente realizado un join entre SALIDAS y NOTASCREDITO.

Insisto, no he probado el Select pero mas o menos esta es la idea. Es cuestión de que vayas probando y viendo qué resultados te interesa obtener.

Si tienes dudas adicionales ....

... se me olvidaba. Debes de asegurarte que la consulta principal esté agrupada no sólo por el nombre del artículo, que puede o no ser único, sino por CLAVE que supongo que sí que será única. Podría darse el caso de que existiese un mismo nombre para dos artículos.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #6  
Antiguo 09-03-2011
nejamube nejamube is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 65
Poder: 15
nejamube Va por buen camino
Multiple rows in singleton select.

Muchas gracias por tu ayuda, pero continuo con problemas.

En realidad la tabla NotasCredito no es para Notas de credito, no la renombre, pero su uso son las entradas de mercancia y no tiene nada que ver con las Notas de credito.

La tabla Salidas es para registrar la salida de mercancia.

Lo que necesito si es como me lo comentas, pero no logro darme cuenta de que estoy haciendo mal, sigo obteniendo el mismo error.


Lo que necesito es los mismos datos que arroja esta consulta, pero con la fecha de un mes anterior, y lo que no puedo hacer es la subconsulta de el mes anterior, me sigue mostrando el error "Multiple rows in singleton select."

Muchas gracias.

Este es el enlace del codigo fuente de el programa y el ejecutable, esto para que puedas ver el funcionamiento y te des una mejor idea de como estan funcionando las cosas, hojala pudieras revisarlo y ayudarme.

http://www.mediafire.com/?0my7wy153xf2ham
[-]

Código SQL [-]
/******************************************************************************/
/***       Generated by IBExpert 2010.03.20 09/03/2011 10:23:10 a.m.        ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

SET CLIENTLIB 'C:\Windows\SysWOW64\FBCLIENT.DLL';

CREATE DATABASE 'E:\2011 Febrero\Favi\Base\BASE.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET ISO8859_1;



/******************************************************************************/
/***                               Generators                               ***/
/******************************************************************************/

CREATE GENERATOR ARTICULOS;
SET GENERATOR ARTICULOS TO 10;

CREATE GENERATOR CATEGORIAS;
SET GENERATOR CATEGORIAS TO 11;

CREATE GENERATOR COSTOS;
SET GENERATOR COSTOS TO 0;

CREATE GENERATOR GEN_NOTASCREDITO_ID;
SET GENERATOR GEN_NOTASCREDITO_ID TO 1827;

CREATE GENERATOR UNIDADES;
SET GENERATOR UNIDADES TO 6;



SET TERM ^ ; 



/******************************************************************************/
/***                           Stored Procedures                            ***/
/******************************************************************************/

CREATE OR ALTER PROCEDURE MONTHLENGTH (
    D DATE)
RETURNS (
    ML INTEGER)
AS
BEGIN
  SUSPEND;
END^



SET TERM ; ^



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/



CREATE TABLE ARTICULOS (
    CLAVE      INTEGER NOT NULL,
    CATEGORIA  SMALLINT NOT NULL,
    UNIDAD     SMALLINT NOT NULL,
    NOMBRE     CHAR(50) NOT NULL,
    COSTO      FLOAT NOT NULL
);

CREATE TABLE CATEGORIAS (
    CLAVE   INTEGER NOT NULL,
    NOMBRE  CHAR(50) NOT NULL
);

CREATE TABLE CODIGOS (
    ARTICULO  INTEGER,
    CODIGO    CHAR(18) NOT NULL,
    TIPO      CHAR(1) NOT NULL
);

CREATE TABLE ENTRADAS (
    CLAVE     INTEGER NOT NULL,
    ARTICULO  INTEGER NOT NULL,
    FECHA     DATE NOT NULL,
    CANTIDAD  INTEGER NOT NULL,
    MONTO     FLOAT NOT NULL,
    COSTO     FLOAT NOT NULL
);

CREATE TABLE NOTASCREDITO (
    CLAVE     INTEGER NOT NULL,
    ARTICULO  INTEGER NOT NULL,
    ESTATUS   CHAR(1) NOT NULL,
    TIPO      CHAR(1) NOT NULL,
    FECHA     DATE NOT NULL,
    CANTIDAD  FLOAT NOT NULL,
    SALIDA    FLOAT,
    PRECIO    FLOAT NOT NULL,
    IVA       FLOAT,
    IMPORTE   FLOAT NOT NULL
);

CREATE TABLE SALIDAS (
    CLAVE     INTEGER NOT NULL,
    ARTICULO  INTEGER NOT NULL,
    ESTATUS   CHAR(1) NOT NULL,
    FECHA     DATE NOT NULL,
    CANTIDAD  FLOAT NOT NULL,
    PRECIO    FLOAT NOT NULL,
    IVA       FLOAT,
    IMPORTE   FLOAT NOT NULL,
    ENTRADA   INTEGER
);

CREATE TABLE UNIDADES (
    CLAVE   INTEGER NOT NULL,
    NOMBRE  CHAR(50) NOT NULL
);



/******************************************************************************/
/***                                 Views                                  ***/
/******************************************************************************/


/* View: NOMBREVISTA */
CREATE OR ALTER VIEW NOMBREVISTA(
    NOMBRE)
AS
select nombre from articulos
;




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE ARTICULOS ADD CONSTRAINT PK_ARTICULOS PRIMARY KEY (CLAVE);
ALTER TABLE CATEGORIAS ADD CONSTRAINT PK_CATEGORIA PRIMARY KEY (CLAVE);
ALTER TABLE ENTRADAS ADD CONSTRAINT PK_ENTRADAS_1 PRIMARY KEY (CLAVE);
ALTER TABLE NOTASCREDITO ADD CONSTRAINT PK_NOTASCREDITO PRIMARY KEY (CLAVE);
ALTER TABLE SALIDAS ADD CONSTRAINT PK_SALIDAS_1 PRIMARY KEY (CLAVE);
ALTER TABLE UNIDADES ADD CONSTRAINT PK_UNIDAD PRIMARY KEY (CLAVE);


/******************************************************************************/
/***                              Foreign Keys                              ***/
/******************************************************************************/

ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS_CATEGORIA FOREIGN KEY (CATEGORIA) REFERENCES CATEGORIAS (CLAVE) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ARTICULOS ADD CONSTRAINT FK_ARTICULOS_UNIDAD FOREIGN KEY (UNIDAD) REFERENCES UNIDADES (CLAVE) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE ENTRADAS ADD CONSTRAINT FK_ENTRADAS_ARTICULO FOREIGN KEY (ARTICULO) REFERENCES ARTICULOS (CLAVE) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT;
ALTER TABLE NOTASCREDITO ADD CONSTRAINT FK_NOTASCREDITO_ARTICULO FOREIGN KEY (ARTICULO) REFERENCES ARTICULOS (CLAVE) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT;
ALTER TABLE SALIDAS ADD CONSTRAINT FK_SALIDAS_ARTICULO FOREIGN KEY (ARTICULO) REFERENCES ARTICULOS (CLAVE) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT;


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX IDX_CODIGOS_ARTICULO ON CODIGOS (ARTICULO);
CREATE INDEX IDX_CODIGOS_CODIGO ON CODIGOS (CODIGO);


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/



/* Trigger: ARTICULOS_BI0 */
CREATE OR ALTER TRIGGER ARTICULOS_BI0 FOR ARTICULOS
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  /* Trigger text */
   new.clave = gen_id(articulos,1);
end
^

/* Trigger: CATEGORIA_BI0 */
CREATE OR ALTER TRIGGER CATEGORIA_BI0 FOR CATEGORIAS
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  /* Trigger text */
   new.clave = gen_id(categoriaS,1);
end
^

/* Trigger: NOTASCREDITO_BI */
CREATE OR ALTER TRIGGER NOTASCREDITO_BI FOR NOTASCREDITO
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.CLAVE IS NULL) THEN
    NEW.CLAVE = GEN_ID(GEN_NOTASCREDITO_ID,1);
END
^

/* Trigger: SALIDAS_BI */
CREATE OR ALTER TRIGGER SALIDAS_BI FOR SALIDAS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.CLAVE IS NULL) THEN
    NEW.CLAVE = GEN_ID(GEN_NOTASCREDITO_ID,1);
END
^

/* Trigger: UNIDAD_BI0 */
CREATE OR ALTER TRIGGER UNIDAD_BI0 FOR UNIDADES
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  /* Trigger text */

   new.clave = gen_id(unidades,1);
end
^

SET TERM ; ^



/******************************************************************************/
/***                           Stored Procedures                            ***/
/******************************************************************************/


SET TERM ^ ;

CREATE OR ALTER PROCEDURE MONTHLENGTH (
    D DATE)
RETURNS (
    ML INTEGER)
AS
declare variable TMP date;
BEGIN
    TMP = D - EXTRACT(DAY FROM D) + 32;
    ML  = EXTRACT(DAY FROM (TMP - EXTRACT(DAY FROM TMP)));
END^



SET TERM ; ^
Responder Con Cita
  #7  
Antiguo 09-03-2011
nejamube nejamube is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 65
Poder: 15
nejamube Va por buen camino
Enlace

Nuevo enlace, olvide incluir un archivo:

http://www.mediafire.com/?wm3vwpv8oy3lkpd

Última edición por nejamube fecha: 09-03-2011 a las 22:37:57. Razón: Olvide incluir archivo.
Responder Con Cita
  #8  
Antiguo 10-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Hola !

Tampoco este último enlace funciona.

En cualquier caso, he creado las tablas con el Script que has puesto, y he generado algunos datos.

No sé si es el sitio adecuado para argumentar que para mi es un tremendo lío ver tantos campos 'CLAVE' iguales. Personalmente los llamaría diferentes para cada tabla, algo así como 'CLAVEARTICULO', 'CLAVEUNIDAD', etc. Pero lo dicho, ese no es el tema ahora mismo.

Los datos que he generado, probablemente estén mal, porque no entiendo la relación entre S.ENTRADA y E.CLAVE que tienes en el segundo join.

Lo que sí puedo indicarte es que el último Select que posteé yo, a mi no me dá ningún tipo de error. Insisto, no sé si tengo los datos correctos, y si el resultado obtenido es el que se desea. Pero el Select funciona (a falta de un ')' que se me pasó al escribir).

No sé si te será una ayuda, o te trastocará toda tu forma de trabajar, pero personalmente hubiera armado la consulta de la siguiente manera :

Código SQL [-]
Select A.CLAVE, A.NOMBRE, U.NOMBRE UNIDAD, C.NOMBRE CATEGORIA,
 
(Select sum(E2.IMPORTE) from NOTASCREDITO E2
 where E2.ARTICULO = A.CLAVE
 and E2.FECHA between '01-01-2011' and '03-31-2011') as IMPORTEENTRADA
 
from Z_ARTICULOS A
left join Z_CATEGORIAS C   on A.CATEGORIA = C.CLAVE
left join Z_UNIDADES U     on A.UNIDAD = U.CLAVE
y las demás subconsultas que procedan para cada periodo de fechas.

Si pudiera obtener algún grupo de datos, podría probarlo mejor. Con el IBExpert puedes exportar también los datos en un Script de comandos 'Insert'. Al menos unos cuantos para que el resultado se pueda probar eficientemente.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #9  
Antiguo 10-03-2011
nejamube nejamube is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 65
Poder: 15
nejamube Va por buen camino
Hola

Cita:
Empezado por gluglu Ver Mensaje
Hola !

Tampoco este último enlace funciona.

En cualquier caso, he creado las tablas con el Script que has puesto, y he generado algunos datos.

No sé si es el sitio adecuado para argumentar que para mi es un tremendo lío ver tantos campos 'CLAVE' iguales. Personalmente los llamaría diferentes para cada tabla, algo así como 'CLAVEARTICULO', 'CLAVEUNIDAD', etc. Pero lo dicho, ese no es el tema ahora mismo.

Los datos que he generado, probablemente estén mal, porque no entiendo la relación entre S.ENTRADA y E.CLAVE que tienes en el segundo join.

Lo que sí puedo indicarte es que el último Select que posteé yo, a mi no me dá ningún tipo de error. Insisto, no sé si tengo los datos correctos, y si el resultado obtenido es el que se desea. Pero el Select funciona (a falta de un ')' que se me pasó al escribir).

No sé si te será una ayuda, o te trastocará toda tu forma de trabajar, pero personalmente hubiera armado la consulta de la siguiente manera :

Código SQL [-]Select A.CLAVE, A.NOMBRE, U.NOMBRE UNIDAD, C.NOMBRE CATEGORIA, (Select sum(E2.IMPORTE) from NOTASCREDITO E2 where E2.ARTICULO = A.CLAVE and E2.FECHA between '01-01-2011' and '03-31-2011') as IMPORTEENTRADA from Z_ARTICULOS A left join Z_CATEGORIAS C on A.CATEGORIA = C.CLAVE left join Z_UNIDADES U on A.UNIDAD = U.CLAVE

y las demás subconsultas que procedan para cada periodo de fechas.

Si pudiera obtener algún grupo de datos, podría probarlo mejor. Con el IBExpert puedes exportar también los datos en un Script de comandos 'Insert'. Al menos unos cuantos para que el resultado se pueda probar eficientemente.
Hola, muchas gracias por ser tan paciente.

http://www.mediafire.com/?lkay5sn72v3te9g.

Elimine el archivo porque crei que ya lo habias descargado, el enlace de arriba si funciona.

Revisare lo que me comentas.

Muchas gracias.
Responder Con Cita
  #10  
Antiguo 10-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
He descargado el archivo.

Al ejecutar el EXE no me encuentra la BBDD, supongo que por la ruta. Y por otro lado, tengo instalado Firebird 2.1, y no me deja abrir la BBDD.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #11  
Antiguo 10-03-2011
nejamube nejamube is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 65
Poder: 15
nejamube Va por buen camino
Firebird 2.5

Yo utilizo Firebird 2.5, puedes usar el Script para recrear la base de datos y puedas usarla con Firebird 2.1.


Adjunto los archivos de configuracion, en caso de que no esten en el archivo comprimido, estos deben de estar en el directorio del programa.

La ruta a la base de datos la puedes cambiar directamente en el archivo config.ini.

Si tienes alguna duda me dices por favor.
Archivos Adjuntos
Tipo de Archivo: zip Configuracion.zip (2,3 KB, 14 visitas)
Responder Con Cita
  #12  
Antiguo 10-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Conseguí cambiar la ruta de la base de datos directamente dentro de tu programa.

Lo que pasa es que al no tener FB2.5 instalado, no logro acceder a la BBDD. Ni con el IBExpert. Por lo tanto tampoco logro generar ningún script de datos.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #13  
Antiguo 10-03-2011
nejamube nejamube is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 65
Poder: 15
nejamube Va por buen camino
Exclamation Script SQL

Cita:
Empezado por gluglu Ver Mensaje
Conseguí cambiar la ruta de la base de datos directamente dentro de tu programa.

Lo que pasa es que al no tener FB2.5 instalado, no logro acceder a la BBDD. Ni con el IBExpert. Por lo tanto tampoco logro generar ningún script de datos.
Este es el script SQL, puedes generar la base de datos desde Ibexpert, Ctrl+F12, o en Herramientas - Script Executive, asi evitas desinstalar Firebird 2.1.
Archivos Adjuntos
Tipo de Archivo: zip costos SQL.zip (1,5 KB, 4 visitas)
Responder Con Cita
  #14  
Antiguo 10-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
La base de datos la pude crear con el Script que incluías en tu post de ayer. Eso es lo que te indicaba en mi primer post de hoy.

Lo que no puedo probar correctamente el Select con unos datos que tengan sentido real, porque yo introduje unos datos muy escuetos. Por eso te decía que pude probar el Select indicado, y que a mi no me daba ningún error.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #15  
Antiguo 10-03-2011
nejamube nejamube is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 65
Poder: 15
nejamube Va por buen camino
Thumbs up Gracias

Muchas gracias, voy a revisarlo muy a detalle.

Responder Con Cita
  #16  
Antiguo 14-03-2011
nejamube nejamube is offline
Miembro
 
Registrado: nov 2009
Ubicación: Buenos Aires
Posts: 65
Poder: 15
nejamube Va por buen camino
Thumbs up Muchas gracias.

Cita:
Empezado por gluglu Ver Mensaje
La base de datos la pude crear con el Script que incluías en tu post de ayer. Eso es lo que te indicaba en mi primer post de hoy.

Lo que no puedo probar correctamente el Select con unos datos que tengan sentido real, porque yo introduje unos datos muy escuetos. Por eso te decía que pude probar el Select indicado, y que a mi no me daba ningún error.
Escribo para agradecerte por tu ayuda, la subconsulta está funcionando perfectamente, es como lo necesitaba. No lo hubiera logrado sin tu ayuda y aprendí algo nuevo.

Este es el código completamente funcional, y no es diferente al que me enviaste en un principio, tu código siempre estuvo correcto, lo que pasa es que tenía mucha presión y no preste atención a tus comentarios.

! Muchas gracias gluglu !

Código SQL [-]
select A.CLAVE, A.NOMBRE, U.NOMBRE UNIDAD, C.NOMBRE CATEGORIA, cast(sum(E.IMPORTE) as float) IMPORTEENTRADA,
       cast(sum(E.CANTIDAD) as integer) CANTIDADENTRADA, cast(sum(S.IMPORTE) as float) IMPORTESALIDA,
       cast(sum(S.CANTIDAD) as integer) CANTIDASALIDA,
       /*SUBCONSULTAS INICIO*/
       (select cast(sum(E2.IMPORTE) as float)
        from ENTRADAS E2
        where E2.ARTICULO = A.CLAVE and
              E2.FECHA between '01-01-2011' and '02-28-2011') as IMPORTEENTRADAANTERIOR,

       (select cast(sum(E2.CANTIDAD) as float)
        from ENTRADAS E2
        where E2.ARTICULO = A.CLAVE and
              E2.FECHA between '01-01-2011' and '02-28-2011') as CANTIDADENTRADAANTERIOR,

       (select cast(sum(S2.CANTIDAD) as float)
        from SALIDAS S2
        where S2.ARTICULO = A.CLAVE and
              S2.FECHA between '01-01-2011' and '02-28-2011') as CANTIDADSALIDAANTERIOR,

       (select cast(sum(S2.IMPORTE) as float)
        from SALIDAS S2
        where S2.ARTICULO = A.CLAVE and
              S2.FECHA between '01-01-2011' and '02-28-2011') as IMPORTESALIDAANTERIOR
       /*SUBCONSULTAS FIN*/
from ARTICULOS A
left join ENTRADAS E on E.ARTICULO = A.CLAVE
left join SALIDAS S on S.ENTRADA = E.CLAVE
left join CATEGORIAS C on A.CATEGORIA = C.CLAVE
left join UNIDADES U on A.UNIDAD = U.CLAVE

where (S.FECHA between :INICIAL and :FINAL) or (E.FECHA between :INICIAL and :FINAL)

group by A.CLAVE, C.NOMBRE, A.NOMBRE, U.NOMBRE
Responder Con Cita
  #17  
Antiguo 15-03-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
... de nada !
__________________
Piensa siempre en positivo !
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda con subconsulta Punzo MySQL 1 10-07-2010 18:42:38
Crear SubConsulta en Sql con datos desde Tabla RRenault SQL 8 10-07-2010 00:11:43
Subconsulta en un ADOQuery Sr.Scorpion SQL 4 09-08-2005 11:08:34
justificar datos de un edit a la derecha JODELSA Varios 1 18-05-2005 22:43:15
Subconsulta DanielAlexander SQL 3 19-05-2003 21:59:56


La franja horaria es GMT +2. Ahora son las 05:45:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi