SQL - Simplifier requêtes

Callie33 Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   -  
Callie33 Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

Voici un échantillon de la table de j'utilise :

| eod_id | company_symbol |    date    | open  | close | high  |  low  |
|      1 |            AAA | 01-01-2000 | 40.00 | 42.00 | 43.00 | 39.00 |


Pour un company_symbol, je veux :

Calculer (open for a date)/(close for an other date) - 1
Le nombre de lignes où open > close
Le nombre de lignes où open < close
Le nombre de jours où company_symbol a le plus grand close
Le nombre de jours où company_symbol a le plus petit close

Voici les requêtes que j'ai faites :
SELECT (SELECT OPEN FROM eod WHERE company_symbol="AAPL" AND DATE="2013-04-05") 
/ (SELECT OPEN FROM eod WHERE company_symbol="AAPL" AND DATE="2000-01-03") - 1;

SELECT COUNT(*) FROM eod WHERE company_symbol="AAPL" AND CLOSE>OPEN;

SELECT COUNT(*) FROM eod WHERE company_symbol="AAPL" AND CLOSE<OPEN;

SELECT COUNT(*) FROM EOD WHERE company_symbol IN (SELECT company_symbol FROM eod WHERE CLOSE IN (SELECT max(CLOSE) FROM eod GROUP BY DATE));


Pour la 4, ça ne fonctionne pas, pourriez-vous m'aiguiller ?
Aussi, serait-il possible de simplifier chacune des requêtes, ou même les réunir en une seule ?

Merci d'avance,

Callie
A voir également:

1 réponse

Morgothal Messages postés 1236 Date d'inscription   Statut Membre Dernière intervention   183
 
Bonjour,
Pour les 3 premières requêtes, difficile de faire plus simple...

Pour la 4, je ferais comme ceci :
SELECT count(*) FROM EOD WHERE CLOSE = (SELECT MAX(CLOSE) FROM EOD  WHERE COMPANY_SYMBOL = 'AAPL') GROUP BY DATE

Et pour la 5, remplacer le MAX par un MIN.

J'espère que ça peut aider :-)

A+ !
0
Callie33 Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   8
 
Bonjour,
Merci pour l'aide, mais cette requête ne fait pas ce que je souhaite.
Le "SELECT MAX (close) ne retourne qu'une ligne, or AAPL peut être le max(close) pour plusieurs date.
Je suis assez claire ?
Merci :)
0
Morgothal Messages postés 1236 Date d'inscription   Statut Membre Dernière intervention   183
 
Euuh, il faut avoir un résultat de ce goût là ?
| COMPANY_SYMBOL | Nb_jours |
| AAPL           | 6        |
| AAPL2          | 10       |
| etc...


En d'autres termes, le nombre de jours où le champ CLOSE est à son maximum, pour chaque COMPANY_SYMBOL ?
0
Callie33 Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   8
 
Pourquoi pas, mais c'est plutôt pour un company_symbol donné.
En fait, c'est une table qui contient des valeurs boursières. company_symbol est le nom de l'action, est close la valeur de l'action à la fermeture d'une journée.
Le but de la requête est de savoir pour une action, sur une période donnée, le nombre de fois où elle a été l'action la plus chère à la fermeture (close).
C'est plus clair comme ça ?
0
Morgothal Messages postés 1236 Date d'inscription   Statut Membre Dernière intervention   183
 
le nombre de fois où elle a été l'action la plus chère à la fermeture (close)
Ce n'est pas plutôt le nombre de fois où elle a été à son meilleur niveau à la fermeture ?
Ce qui donne :
SELECT COMPANY_SYMBOL, count(*) as "Nb_de_jours" FROM EOD WHERE COMPANY_SYMBOL = "AAPL" AND CLOSE = (SELECT MAX(CLOSE) FROM EOD WHERE COMPANY_NAME = "AAPL") GROUP BY COMPANY_SYMBOL


S'il faut chercher le nombre de jours où l'action a été la plus chère à la fermeture, il faut trouver le plus haut CLOSE de toute la tables sans critère sur l'action :
SELECT COMPANY_SYMBOL, count(*) as "Nb_de_jours" FROM EOD WHERE COMPANY_SYMBOL = "AAPL" AND CLOSE = (SELECT MAX(CLOSE) FROM EOD) GROUP BY COMPANY_SYMBOL
0
Callie33 Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   8
 
Non, c'est bien le nombre de jours où l'action a été la plus chère (la plus haute valeur parmi les autres actions), sachant que les données sont quotidiennes. Donc chaque jour, à la fermeture, une action a le plus de valeur.
Du coup les requêtes ne permettent pas de faire ça. Merci :)
0