SQL - Ayuda en subconsulta

   
Vista:

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 18/02/2015 15:03:26
Hola es la 1ra vez que escribo en este foro y necesito ayuda con una subconsulta que estoy haciendo. Estoy usando como gestor de bd access 2007 y c++ para la parte visual y gestión. Tengo una tabla x donde tengo fecha, hora y dato, lo que necesito es sacar el día donde hubo el máximo de datos diario y ponerlo en un reporte. Me explico, por una parte tengo que sacar las sumas de datos por día, luego sacar el máximo de esas sumas y además el día que hubo ese máximo. Ya la parte de sacar el máximo lo hice y sale bien esta es la consulta

ADOQuery3->Active=False;
ADOQuery3->SQL->Clear();
ADOQuery3->SQL->Add("SELECT MAX(pp) AS maxdia FROM (SELECT SUM(Radiacion) AS pp, Fecha FROM DatosActino GROUP BY Fecha )WHERE (YEAR(Fecha)>= :anno AND YEAR(Fecha)<= :anno2) AND (MONTH(Fecha)= "+temp+")");
ADOQuery3->Parameters->ParamByName("anno")->Value = ComboBox3->Text;
ADOQuery3->Parameters->ParamByName("anno2")->Value = ComboBox4->Text;
ADOQuery3->Active=True;

y traté de hacer esto

ADOQuery3->Active=False;
ADOQuery3->SQL->Clear();
ADOQuery3->SQL->Add("SELECT MAX(pp) AS maxdia, DAY(Fecha) AS dia FROM (SELECT SUM(Radiacion) AS pp, Fecha FROM DatosActino GROUP BY Fecha )WHERE (YEAR(Fecha)>= :anno AND YEAR(Fecha)<= :anno2) AND (MONTH(Fecha)= "+temp+")");
ADOQuery3->Parameters->ParamByName("anno")->Value = ComboBox3->Text;
ADOQuery3->Parameters->ParamByName("anno2")->Value = ComboBox4->Text;
ADOQuery3->Active=True;

pero me da error obvio!! pos la tabla solo me devuelve un valor máximo y lo esto pidiendo con muchas fechas y ahora toy traba pos no se como hacerlo en sql pa no tener que programarlo en c++. Please si alguien me puede ayudar lo agradecería un montón.
Si no entienden me dicen y lo explico mejor
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

Ayuda en subconsulta

Publicado por MMan (12 intervenciones) el 19/02/2015 00:21:32
tal vez asi....

... el total de radiacion (suma) por dia

SELECT SUM(radiacion) as totRadDia, fecha from DatosActino GROUP BY fecha

... el total de radicaion(suma) por dia, pero solo de un rango de fechas

SELECT SUM(radiacion) as totRadDia, fecha from DatosActino GROUP BY fecha WHERE YEAR(Fecha)>= 2000 AND YEAR(Fecha)<= 2015 AND MONTH(Fecha)= 1

... el dia con mayor radiacion
SELECT MAX(totRadDia) AS maxdia, DAY(Fecha) AS dia FROM ( --la consulta anterior-- )


... en vez de programarlo directamente,, primero deberias crear una consulta y probar si te arroja el resultado que deseas..
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

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 19/02/2015 14:27:39
Ya la consulta me funciona bien por lo menos la parte del cálculo ya está comprobado que me devuelve el máximo de las sumas pero no se como puedo sacar el día en que ocurrió ese máximo pos en el reporte tengo que dar ese dato y cuando pongo
SELECT MAX(totRadDia) AS maxdia, DAY(Fecha) AS dia FROM (consulta ...)
me da error o sea si no le pongo la parte en negrita me hace el cálculo perfecto pero cuando le pido el día pos ahí revienta.

Alguna idea??
y gracias por responderme
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

Ayuda en subconsulta

Publicado por MMan (12 intervenciones) el 19/02/2015 15:29:34
tal vez agregando alias a la subconsulta...

SELECT MAX(q.totRadDia) AS maxdia, DAY(q.Fecha) AS dia FROM (consulta ...) q
------------

"googleando" encontre la funcion DATEPART

DatePart ("d", #fecha# ) <-- devuelve el dia


SELECT MAX(totRadDia) AS maxdia, DATEPART("d",Fecha) AS dia FROM (consulta ...)

o

SELECT MAX(q.totRadDia) AS maxdia, DATEPART("d",q.Fecha) AS dia FROM (consulta ...) q
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

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 19/02/2015 15:52:02
ya lo probé en todas esas formas que me recomendaste y na, sigue dando el mismo error ufaa
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

Ayuda en subconsulta

Publicado por Ramiro (7 intervenciones) el 20/02/2015 14:10:12
Emma,

En estos casos debes postear el error que te dá, si no se hace dificil encontrar la solución.

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

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 20/02/2015 14:29:31
ups sorry es que mi conexión es poquita cosa y me demoro mucho. Ahora adjunté una foto del error pa que lo veas.
error
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

Ayuda en subconsulta

Publicado por MMan (12 intervenciones) el 20/02/2015 15:13:37
dice que no existe la funcion datepart,,,, te sale lo mismo con la funcion DAY(fecha) ??
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

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 20/02/2015 15:21:16
si, de todas las formas que pido la fecha me sale ese error
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

Ayuda en subconsulta

Publicado por MMan (12 intervenciones) el 20/02/2015 15:22:39
y si pones DAY(date())

o DAY ( now() )

te sale error ??
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

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 20/02/2015 15:38:06
no me sale error pero lo que me muestra no es el día del máximo sino un número entero largo que lo he probado en varias formas y hasta me sale negativo jejeje pero al menos no sale error. Lo probé de las 2 formas igual hace eso
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

Ayuda en subconsulta

Publicado por MMan (12 intervenciones) el 20/02/2015 17:00:32
y... las pruebas las haces en el access ?
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

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 20/02/2015 17:11:00
no, access solo lo uso como recipiente de datos. Estoy probando desde la aplicación de escritorio que toy haciendo en c++, todas las consultas las hago desde c++ en un query
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

Ayuda en subconsulta

Publicado por Ramiro (7 intervenciones) el 20/02/2015 18:45:21
Lo que esta diciendo el error es que si usas funciones de agregado (COUNT, AVG, SUM, MAX, MIN etc.) luego tienes que indicar cuál es el concepto por el que agrupas, algo que especificas en la cláusula GROUP BY. Es decir que todas las columnas del SELECTsobre las cuales NO aplicas una funcion de agregado deber ponerlas en la calusula GROUP BY

En un ejemplo, sin conocer cual es la consulta que finalemente
estas ejecutando, sería algo como:

SELECT MAX(q.totRadDia) AS maxdia, DAY(q.Fecha) AS dia FROM (consulta ...) GROUP BY DAY(q.Fecha)
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

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 20/02/2015 19:30:52
Entendí lo que me dijiste y tienes razón ya no da ese error. Lo probé pero ahora lo que me retorna es el valor del 1er registro sin tener en cuenta si es el máximo o no y en la fecha me sale un número entero largo que no tiene nada que ver con el día jejee ya ni siquiera me sale el máximo diario como antes. ufaa que frustrante!!
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

Ayuda en subconsulta

Publicado por MMan (12 intervenciones) el 20/02/2015 20:07:59
y si reordenas la consulta


SELECT SUM(radiacion) as totRadDia, DAY(fecha) as DIA from DatosActino GROUP BY fecha WHERE YEAR(Fecha)>= 2000 AND YEAR(Fecha)<= 2015 AND MONTH(Fecha)= 1

... el dia con mayor radiacion
SELECT MAX(totRadDia) AS maxdia, DIA FROM ( --la consulta anterior-- ) GROUP BY dia



... creo que es lo mismo .. pero...
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

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 23/02/2015 16:41:50
Tremendo esto ni atras ni alante me sale!!! Les agradezco muchísimo su ayuda y si se les ocurre algo más tiren pa acá que yo pruebo cualquier cosa jejejee.
Saludos y gracias
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

Ayuda en subconsulta

Publicado por MMan (12 intervenciones) el 23/02/2015 20:51:49
como mencione antes...

y si lo haces en el access ?

crea la consulta ahi.. lo pruebas y verificas si retorna los datos o no...

por descarte.. si funciona ahi.. entonces es algo con el codigo en c++

y/o si funciona.. tal vez te puedas conectar directo a la query en vez de crear un query dinamico
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

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 23/02/2015 21:58:54
lo probé en access como sugeriste y me salen varios máximos es decir de todos las sumas de los días 1 saca la máxima, de los días 2 lo mismo, y así por cada día pero yo lo que quiero es el día en que ocurrió la suma máxima absoluta ejemplo:
tengo varias sumas:

sumdia ------ DIA

6,51 -------- 1
7,67 -------- 2
9,49 -------- 3
8,28 -------- 4
7,71 -------- 5
8,08 -------- 6
8,54 -------- 7
8,69 -------- 8
8,41 -------- 9
7,82 -------- 10
7,78 -------- 11
8,95 -------- 12
8,77 -------- 13
9,56 -------- 14
9,3 -------- 15
8,72 -------- 16
6,6 -------- 17
...
....
... etc..

cuando yo le pida el máximo y su fecha debería salirme

maxdia -- dia
9,56 ------- 14

eso es lo que quiero
en la consulta con subconsulta que postee al principio hace hasta sacar el máximo o sea me devuelve 9,56 pero el día no me sale na de na.

De veras que les agradezco que me ayuden sigan sugiriendo
DLBM
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

Ayuda en subconsulta

Publicado por MMan (12 intervenciones) el 23/02/2015 22:24:11
esa tabla tiene algun otro campo... o solo fecha + radiacion ?

------------

AHHHHHHH
yo pense que querias los maximos por cada uno de los dias
----

acabo de crearme una tabla en access.......... y probando
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

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 23/02/2015 22:39:04
Los campos de la tabla son Estación, Fecha, Hora y Radiación
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

Ayuda en subconsulta

Publicado por MMan (12 intervenciones) el 23/02/2015 22:57:28
SELECT TOP 1 fecha, Max(totRad) AS MaxtotRad
FROM (SELECT DatosActino.fecha AS fecha, Sum(DatosActino.radiacion) AS totRad
FROM DatosActino
GROUP BY DatosActino.fecha) as sumaxdia
GROUP BY [sumaxdia].fecha
ORDER BY Max(totRad) DESC;



eso te muestra el max de max de la suma x fecha
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda en subconsulta

Publicado por Emma B. (12 intervenciones) el 24/02/2015 15:39:27
wow!! ya me sale mil gracias!! no sabes la alegría que me da
ya la probé en la aplicación en c++ y picha perfecto!! eeeee Dios te bendiga mucho
un millón de gracias, cuando cobre mi salario te pago
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