question SQL

question SQL - Programmation

Marsh Posté le 09-01-2002 à 23:41:48    

on peut faire ca ?
(le but est de connaitre tous les login de temps de connex maximum)
 
SELECT login from connexions HAVING sum(duree)= (SELECT sum(duree) AS time from connexions HAVING MAX(time))
 
edit : ok le group by était inutile ;)

 

[edtdd]--Message édité par sisicaivrai--[/edtdd]

Reply

Marsh Posté le 09-01-2002 à 23:41:48   

Reply

Marsh Posté le 09-01-2002 à 23:48:47    

j'ai meme po peur du bide :o

Reply

Marsh Posté le 09-01-2002 à 23:49:32    

:wahoo:

Reply

Marsh Posté le 09-01-2002 à 23:54:38    

y a personnes a qui ca dit quelque chose...

Reply

Marsh Posté le 09-01-2002 à 23:56:19    

défini un peu mieux ce qu'est le temps de connecion maxi


---------------
à mon âge, on ne me suce plus, on me mâche
Reply

Marsh Posté le 09-01-2002 à 23:56:48    

comprends pas ce que tu veux faire :)
 
(le deuxième HAVING est plus que louche pour moi en tout cas)

 

[edtdd]--Message édité par joce--[/edtdd]


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 09-01-2002 à 23:59:01    

et bien je veux lister tous les logins avec le temps de connexion qui est le plus grand
 
merci de participer :)
 
PS : pas sympa le move....

Reply

Marsh Posté le 09-01-2002 à 23:59:49    

et
 
SELECT login from connexions group by login ORDER BY duree DESC LIMIT 0,50
 
?
(ou time à la place de duree)

Reply

Marsh Posté le 10-01-2002 à 00:02:14    

non car malheureusement je ne dois sortir que les login de temps de connexion le plus grand
 
c'est un sale exo theorique, bien sur en pratique ce serait plus tranquille  :sweat:
 
et de plus je dois sommer les temps de connexion, la table connexion n'est qu'un log

 

[edtdd]--Message édité par sisicaivrai--[/edtdd]

Reply

Marsh Posté le 10-01-2002 à 00:02:35    

dans ce cas, il y a plus simple :
Select Login, Max(Time)
From Connexion
group by Login


---------------
à mon âge, on ne me suce plus, on me mâche
Reply

Marsh Posté le 10-01-2002 à 00:02:35   

Reply

Marsh Posté le 10-01-2002 à 00:03:37    

bardass a écrit a écrit :

dans ce cas, il y a plus simple :
Select Login, Max(Time)
From Connexion
group by Login  




je dois sommer
le temps total de connexion n'est pas donné

 

[edtdd]--Message édité par sisicaivrai--[/edtdd]

Reply

Marsh Posté le 10-01-2002 à 00:05:21    

la table connexion contient les logs du genre : login, date, heure, duree de connexion

Reply

Marsh Posté le 10-01-2002 à 00:06:31    

au dodo
ce sera pour demain
 :hello:


---------------
à mon âge, on ne me suce plus, on me mâche
Reply

Marsh Posté le 10-01-2002 à 00:06:52    

bardass a écrit a écrit :

au dodo
ce sera pour demain
 :hello:  




 :hello:

Reply

Marsh Posté le 10-01-2002 à 06:09:51    

salut à tous...
De retour pour un petit passage seulement... :D
 
déjà, un group by sur une donnée lorsqu'on ne retourne que cette donnée... ben... fo pas faire car inutile... :D
 
le truc de bardass me semble correcte...
 
Si tu dois sommer les durees pas login... alors ou est le maximum ?
Pige pas trop ton pb. :??:

Reply

Marsh Posté le 10-01-2002 à 10:06:09    

sisicaivrai a écrit a écrit :

la table connexion contient les logs du genre : login, date, heure, duree de connexion  




il est là mon probleme :  
je dois d'abord pour chaque login sommer son temps total de connexion, et puis afficher le ou les logins dont le temps de connexion est le plus grand
et uniquement celui là (ceux la), pas question de faire un order by et de prendre que le 1er :(

 

[edtdd]--Message édité par sisicaivrai--[/edtdd]

Reply

Marsh Posté le 10-01-2002 à 10:55:10    

SELECT login, sum(duree) FROM connexions
  GROUP BY login
  HAVING max(duree) = (SELECT max(duree) from connexions)
 
Avec ça tu obtiendras un truc de ce genre :
 
LOGIN        SUM(DUREE)
-----        ----------
AZERT        15206
YUIOP        2630
QSDFG        98563
 
où AZERT, YUIOP et QSDFG ont, parmi leur différentes durées de connexions, une durée égale à la durée de connexion maximale...
C'est ça que tu voulais ?
(j'ai testé cette requête sur Oracle, ça marche)

 

[edtdd]--Message édité par irulan--[/edtdd]

Reply

Marsh Posté le 10-01-2002 à 10:58:40    

pas tout a fait irulan :hello: , ce que je voudrais :  

Code :
  1. table:
  2. login   date           duree
  3. x       21/10/2001      15
  4. x       22/10/2001      10
  5. y       21/10/2001       5
  6. y       23/10/2001       5
  7. z       20/10/2001       25
  8. resultat :
  9. login
  10. x
  11. z


 :jap:
 
il doit manquer un truc a droite :
SELECT login from connexions HAVING sum(duree)= (SELECT sum(duree),login AS time from connexions GROUP BY login HAVING MAX(time))
non, ca va pas a cause du sum(duree)=select multiple :(
on peut faire un max(sum(duree)) ?
 
:??:

 

[edtdd]--Message édité par sisicaivrai--[/edtdd]

Reply

Marsh Posté le 10-01-2002 à 13:11:33    

SELECT Login,Max(Durée)  
FROM Connexions,Abonnements  
WHERE Max(Durée) IN  
(SELECT Login,Sum(Durée)  
FROM Connexions  
GROUP BY Login)  
 
?

Reply

Marsh Posté le 10-01-2002 à 16:23:20    

Je ne pense pas que tu puisses faire ça en une seule requête SQL : un MAX(SUM(DUREE)) n'est pas possible.
 
Autre chose, quand tu utilises MAX(duree), ça ne te sort que la valeur MAXIMALE présente dans la colonne duree, en aucune façon ça ne représente la somme des durées.
 
Donc dans tous les cas => blocked !

Reply

Marsh Posté le 10-01-2002 à 16:30:35    

en fait cette question fait partie de l'examen de l'an passé du cours que j'ai demain :(
 
il y a un corrigé avec, mais il semble complètement faux :(
 
leur réponse :  

Code :
  1. select Login
  2.   from Connexions
  3. group by Login
  4. having Sum(Durée) = (select Max(Durée)
  5.                        from Connexions
  6.                       group by Login);


notez le group by inutile, que j'avais repris dans ma solution du coup...
 
ils ont du mal exprimer ce qu'ils voulaient, car ici il semble prendre comme duree total sommée =max des durees partielles

Reply

Marsh Posté le 10-01-2002 à 16:39:20    

irulan a écrit a écrit :

Je ne pense pas que tu puisses faire ça en une seule requête SQL : un MAX(SUM(DUREE)) n'est pas possible.




 
Sur Oracle 7 et + les requêtes d'agrégation imbriquées sont possibles alors que ce n'est pas encore le cas avec PostgreSQL ( :??: )
 
On peut très bien faire SELECT AVG(MAX(SALAIRE)) FROM EMP; et faire aussi SELECT MAX(AVG(SALAIRE)) FROM EMP;

 

[edtdd]--Message édité par AlphaT--[/edtdd]

Reply

Marsh Posté le 10-01-2002 à 16:43:26    

AlphaT a écrit a écrit :

 
 
Sur Oracle 7 et + les requêtes d'agrégation imbriquées sont possibles alors que ce n'est pas encore le cas avec PostgreSQL ( :??: )
 
On peut très bien faire SELECT AVG(MAX(SALAIRE)) FROM EMP; et faire aussi SELECT MAX(AVG(SALAIRE)) FROM EMP;  
 
 




et ici faire un max(sum(duree)) donnerait ce que je cherche?

Reply

Marsh Posté le 10-01-2002 à 18:21:29    

essaye d'inverser le problème.
 
calcul le temps max de connexion et recupère les logins correspondants.
 
 
essaye:
select max(sum(t1.duree)),distinct t1.login from table t1, table t2
where t1.login = t2.login
group by t1.login
 
 
 
mais sinon, en une seule requete, c'est pas évident


---------------
Je ne suis ni pour, ni contre, bien au contraire  
Reply

Marsh Posté le 10-01-2002 à 18:27:38    

jupiler a écrit a écrit :

essaye d'inverser le problème.
 
calcul le temps max de connexion et recupère les logins correspondants.
 
 
essaye:
select max(sum(t1.duree)),distinct t1.login from table t1, table t2
where t1.login = t2.login
group by t1.login
 
 
 
mais sinon, en une seule requete, c'est pas évident  




je suis d'accord sur le principe, mais je ne vois pas bien ce que tu fais :sweat:

Reply

Marsh Posté le 10-01-2002 à 18:33:28    

sisicaivrai a écrit a écrit :

en fait cette question fait partie de l'examen de l'an passé du cours que j'ai demain :(
 
il y a un corrigé avec, mais il semble complètement faux :(
 
leur réponse :  

Code :
  1. select Login
  2.   from Connexions
  3. group by Login
  4. having Sum(Durée) = (select Max(Durée)
  5.                        from Connexions
  6.                       group by Login);


notez le group by inutile, que j'avais repris dans ma solution du coup...
 
ils ont du mal exprimer ce qu'ils voulaient, car ici il semble prendre comme duree total sommée =max des durees partielles  




 
leur réponse est tout a fait correcte, je vois pas ce qui te dérange dedans. Pour info, le group by fait office de sum...

Reply

Marsh Posté le 10-01-2002 à 18:36:19    

gizmo a écrit a écrit :

 
 
leur réponse est tout a fait correcte, je vois pas ce qui te dérange dedans. Pour info, le group by fait office de sum...  




comment ca ils somment avec group by?  :sweat:
 
select Login
 from Connexions
group by Login c utile, ca?
having Sum(Durée) = (select Max(Durée)
                      from Connexions
                     group by Login);

 

[edtdd]--Message édité par sisicaivrai--[/edtdd]

Reply

Marsh Posté le 10-01-2002 à 18:38:08    

ben oui c'est utile! tout comme le second, ils ont le même rôle...

Reply

Marsh Posté le 10-01-2002 à 18:38:55    

gizmo a écrit a écrit :

ben oui c'est utile! tout comme le second, ils ont le même rôle...  




explique moi stp, je ne vois pas :sweat:

Reply

Marsh Posté le 10-01-2002 à 23:03:28    

nope, oublie, j'ai dis une connerie, c'est pas généralisé du tout comme fonction du group by
 
Une solution correct, c'est effectivement celle d'alphaT, a savoir  

Code :
  1. SELECT login FROM connexions
  2. GROUP BY login
  3. HAVING sum(duree)=max((sum)duree)


 
mais il faut que la db que tu utilises accepte les agrégations imbriquées, ce qui n'est pas la cas de mysql ni access.
 
Mais il faut voir ce que ton prof veux. Tiens au fait, ton prof, c'est pas Zimany, par hasard?

Reply

Marsh Posté le 10-01-2002 à 23:04:13    

gizmo a écrit a écrit :

nope, oublie, j'ai dis une connerie, c'est pas généralisé du tout comme fonction du group by
 
Une solution correct, c'est effectivement celle d'alphaT, a savoir  

Code :
  1. SELECT login FROM connexions
  2. GROUP BY login
  3. HAVING sum(duree)=max((sum)duree)


 
mais il faut que la db que tu utilises accepte les agrégations imbriquées, ce qui n'est pas la cas de mysql ni access.
 
Mais il faut voir ce que ton prof veux. Tiens au fait, ton prof, c'est pas Zimany, par hasard?  




si  :sol:
 
ESTEBAN PAS POWAZAAA :sweat:  
 
et Minou l'assistant...

 

[edtdd]--Message édité par sisicaivrai--[/edtdd]

Reply

Marsh Posté le 10-01-2002 à 23:07:41    

j'ai exam demain  :sweat:  
 
 
 :hello:

Reply

Marsh Posté le 10-01-2002 à 23:33:27    

info ou polytech?
 
Bah, si c'est ca, te bile pas, je me suis tapé un 15 sans avoir ouvert le cours. Minou a même filé des réponses à des copains pendant l'exam (sans s'en rendre compte, le con :D).
 
Tiens, au fait, votre travail, l'enoncé était correct? linguistiquement parlant? Je me suis enguelé avec lui l'année passée parce que c'est phrases auraient fait se retourner bécherelle dans sa tombe...

Reply

Marsh Posté le 10-01-2002 à 23:36:29    

info, mais pas de différence hein ;)
bah je sais bien que c'est un exam bidon, mais ca me fait peur que ce soit minou qui corrige :sweat:  
quand je le vois...
 
et pis certaines requetes sont hardos
 
 
l'énoncé http://polytech.ulb.ac.be/cours/info364/projet.pdf  
ben cai du parlai minou kwa, cai comme kan il explik au TP :sarcastic:  
 
t'es en quelle année?
vais vraiment :sleep: lé tard :o
 
 :hello:
 
PS : tiens au fait l'exo doit te rappeler quelque chose, il est tiré de l'exam de l'an passé ;)

 

[edtdd]--Message édité par sisicaivrai--[/edtdd]

Reply

Marsh Posté le 10-01-2002 à 23:41:51    

ben, oui, ca me disait qqch mais comme je garde pas mes anciens exam.
Sinon chuis en 2eme license info. je vais lire ce truc a mon aise.

Reply

Marsh Posté le 11-01-2002 à 11:05:49    

AlphaT a écrit a écrit :

 
 
Sur Oracle 7 et + les requêtes d'agrégation imbriquées sont possibles alors que ce n'est pas encore le cas avec PostgreSQL ( :??: )
 
On peut très bien faire SELECT AVG(MAX(SALAIRE)) FROM EMP; et faire aussi SELECT MAX(AVG(SALAIRE)) FROM EMP;  
 
 




 
Ben c'est bizarre, hier en faisant des tests pour ça justement, Oracle m'avait renvoyé un message d'erreur, me disant qu'il y avait un problème d'imbrication. Et là je viens de retester, et ça marche nickel :??:
Bon, désolé pour l'info erronée (Oracle m'a bien eu sur ce coup-là :p )

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed