SQL - conulta sql

   
Vista:

conulta sql

Publicado por alejo (5 intervenciones) el 04/04/2014 16:29:28
Hola a todos, estoy intentando hacer una consulta en sql en access 2003 y me sale un error que dice "Ha escrito una subconsulta que puede devolver mas de un campo sin utilizar la palabra reservada EXISTS en la clausula FROM de la consulta principal. Corrija la instruccion SELECT de la subconsutla para solicitar un unico campo "
esta es la consulta:
1
2
3
4
5
6
7
8
SELECT asientos.cta, plan_ctas.desc, Sum(asientos.debe) AS SumaDedebe, Sum(asientos.haber) AS SumaDehaber, Sum([debe]-[haber]) AS Total,
(SELECT A.cta, Sum([A.debe]-[A.haber])
FROM asientos as A
WHERE (((A.fecha)<#2/1/2014#))
GROUP BY A.cta) AS sdo_inicial
FROM plan_ctas INNER JOIN asientos ON plan_ctas.cod = asientos.cta
WHERE (((asientos.fecha)>=#1/1/2014# And (asientos.fecha)<=#12/31/2014#))
GROUP BY asientos.cta, plan_ctas.desc;

si ejecuto la subconsulta sola funciona perfectamente, no se donde esta el error de la consulta. dejo un ejemplo de la tabla:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fecha	asto	cta	debe	haber
03/09/2013	80	423003	232,5	0
03/09/2013	80	111101	0	232,5
03/09/2013	81	422109	5	0
03/09/2013	81	111101	0	5
04/09/2013	82	211101	334,09	0
04/09/2013	82	111101	0	334,09
04/09/2013	83	211101	485	0
04/09/2013	83	111101	0	485
09/09/2013	84	422109	5	0
09/09/2013	84	111101	0	5
09/09/2013	85	422109	5	0
09/09/2013	85	111101	0	5
09/09/2013	86	422109	36	0
09/09/2013	86	111101	0	36
10/09/2013	88	422109	31	0
10/09/2013	88	111101	0	31
12/09/2013	89	211101	66,74	0
12/09/2013	89	111101	0	66,74

Si alguno me puede dar una mano desde ya le estoy muy agradecido.

Saludos.

Alejo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

conulta sql

Publicado por leonardo_josue (880 intervenciones) el 04/04/2014 21:21:11
Hola alejo:

El problema en sí, es bastante claro, en su subconsulta estás regresando dos campos:

1
2
3
4
5
6
...
   (   SELECT A.cta, Sum([A.debe]-[A.haber])
       FROM asientos as A
       WHERE (((A.fecha)<#2/1/2014#))
       GROUP BY A.cta) AS sdo_inicial
...

y esto simplemente es imposible de hacer en cualquier motor de BD's... es por eso que te marca el error, es decir, por un lado estás diciendo que te regrese DOS CAMPOS EN EL SELECT (A.cta, Sum([A.debe]-[A.haber]), y al resultado pretendes asignarle un solo alias (sdo_inicial), ???

1
Ha escrito una subconsulta que puede devolver mas de un campo

Cuando haces subconsultas en la sección del SELECT, estos DEBEN REGRESAR SÓLO UN CAMPO, es decir, podrías regresar solo el número de cuenta o el resultado de la suma, PERO NO AMBOS A LA VEZ... Se entiende el problema???

En tu post, sin embargo, nos nos dices en realidad qué es lo que quieres obtener... lo que más me extraña es que estás haciendo una subconsulta SOBRE UNA MISMA TABLA (asientos)... esto me huele a que en realidad estás haciendo algo mal...

Te recomiendo que antes que otra cosa comiences por decirnos cuál es la estructura de cada una de las tablas que intervienen en la consulta (plan_ctas y asientos), dinos cómo es su estructura y pon algunos datos de ejemplo para cada una de ellas. Una vez que hagas esto, puedes entonces explicarnos qué es lo que pretendes obtener como salida a partir de los datos que pones... seguramente podríamos decirte alguna otra forma para obtener lo que quieres... De entrada y sin más información, igual y tu problema se resuelve colocando DOS SUBCONSULTAS en lugar de una, es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
   asientos.cta,
   plan_ctas.desc,
   Sum(asientos.debe) AS SumaDedebe,
   Sum(asientos.haber) AS SumaDehaber,
   Sum([debe]-[haber]) AS Total,
   (   SELECT A.cta
       FROM asientos as A
       WHERE (((A.fecha)<#2/1/2014#))
       GROUP BY A.cta) AS cuenta,
   (   SELECT Sum([A.debe]-[A.haber])
       FROM asientos as A
       WHERE (((A.fecha)<#2/1/2014#))
       GROUP BY A.cta) AS suma
FROM plan_ctas INNER JOIN asientos ON plan_ctas.cod = asientos.cta
WHERE (((asientos.fecha)>=#1/1/2014# And (asientos.fecha)<=#12/31/2014#))
GROUP BY asientos.cta, plan_ctas.desc;

es decir, Si en realidad necesitas regresar AMBOS CAMPOS, poner dos subconsultas (es la misma, sólo en el SELECT regresas un campo a la vez), sin embargo esto es TERRIBLEMENTE INEFICIENTE, por lo que insisto en que debes explicarnos mejor lo que pretendes hacer para poder buscar otra alternativa.

Saludos
Leo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

conulta sql

Publicado por alejo (5 intervenciones) el 08/04/2014 01:35:46
Muchas gracias por la respuesta, lo que quiero hacer es una consulta que tenga en una columna la cuenta (la descripcion es lo de menos eso lo puedo traer despues) el saldo inicial (es lo que quiero obtener con la subconsulta) y los movimientos en el debe y el haber de un periodo dado y otra columna con el saldo. (los movimientos mayores a febrero en las columnas debe haber y los menores a febrero + debe - haber en la misma columna)
No se porque no funciona la consulta que acabo de modificar segun lo que me dijiste:

SELECT asientos.cta, Sum(asientos.debe) AS SumaDedebe, Sum(asientos.haber) AS SumaDehaber, Sum([debe]-[haber]) AS Total, (SELECT Sum([A.debe]-[A.haber]) FROM asientos as A WHERE ((A.fecha)<#2/1/2014#) GROUP BY A.cta) AS sdo_inicial FROM asientos WHERE ((asientos.fecha)>=#2/1/2014# And (asientos.fecha)<=#12/31/2014#) GROUP BY asientos.cta;

me dice que la subconsulta puede devolver como maximo un registro. que es lo mismo que me dice si ejecuto la consulta que tiene las dos subconsultas.

la tabla es la que puse arriba no necesito nada mas, en este paso la descripcion no me importa.

Desde ya muchas gracias.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar