MySQL Forums
Forum List  »  French

Re: requete Mysql, besoin d'aide
Posted by: Jean Molliné
Date: February 26, 2008 12:06PM

Bonsoir,
il faut passer par une auto-jointure multiple en prenant comme point de repère la date. Attention en passant : "date" est un mot réservé en SQL, éviter de l'utiliser comme nom de colonne. Je l'ai utilisé pour coller au jeu d'essai proposé en mettant ce qu'il faut pour que ça fonctionne, mais ce n'est pâs forcément un exemple à suivre à la lettre. Mon conseil sur ce point : préfixer les noms de colonnes avec quelques caractères du nom de la table.

Je suis donc parti du jeu suivant :
mysql> CREATE TABLE ventes (
    ->   `num` INTEGER UNSIGNED  NULL  ,
    ->   `date` DATE  NULL  ,
    ->   `heure` TIME  NULL  ,
    ->   `prix` FLOAT(10,2)  NULL
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO ventes (`num`, `date`, `heure`, `prix`) VALUES
    -> ( 183, '1995-01-13', '10:47:36', 400 ),
    -> ( 183, '1995-01-13', '11:45:12', 450 ),
    -> ( 183, '1995-01-13', '16:45:53', 412 ),
    -> ( 183, '1995-01-14', '12:47:36', 410 ),
    -> ( 183, '1995-01-14', '13:45:12', 480 ),
    -> ( 183, '1995-01-14', '17:45:53', 402 );
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0
Ce qui nous donne les enregistrements suivants :
mysql> SELECT *
    -> FROM ventes
    -> ORDER BY `date`, `heure`;
+------+------------+----------+--------+
| num  | date       | heure    | prix   |
+------+------------+----------+--------+
|  183 | 1995-01-13 | 10:47:36 | 400.00 |
|  183 | 1995-01-13 | 11:45:12 | 450.00 |
|  183 | 1995-01-13 | 16:45:53 | 412.00 |
|  183 | 1995-01-14 | 12:47:36 | 410.00 |
|  183 | 1995-01-14 | 13:45:12 | 480.00 |
|  183 | 1995-01-14 | 17:45:53 | 402.00 |
+------+------------+----------+--------+
6 rows in set (0.00 sec)
Partant de là, je devrais obtenir deux lignes de données, voici comment j'ai procédé :
mysql> SELECT
    ->     v1.`num`, v1.`date`,
    ->     MIN(v1.`heure`) as Heure_mini,
    ->     MAX(v2.`heure`) as Heure_maxi,
    ->     MIN(v3.`prix`) as Prix_mini,
    ->     MAX(v4.`prix`) as Prix_maxi
    -> FROM ventes v1
    ->   INNER JOIN ventes v2
    ->     ON v1.`date` = v2.`date`
    ->   INNER JOIN ventes v3
    ->     ON v1.`date` = v3.`date`
    ->   INNER JOIN ventes v4
    ->     ON v1.`date` = v4.`date`
    -> GROUP BY v1.`date`;
+------+------------+------------+------------+-----------+-----------+
| num  | date       | Heure_mini | Heure_maxi | Prix_mini | Prix_maxi |
+------+------------+------------+------------+-----------+-----------+
|  183 | 1995-01-13 | 10:47:36   | 16:45:53   |    400.00 |    450.00 |
|  183 | 1995-01-14 | 12:47:36   | 17:45:53   |    402.00 |    480.00 |
+------+------------+------------+------------+-----------+-----------+
2 rows in set (0.00 sec)
Mon point de repère ne peut pas être "num" qui est commun à toutes les lignes, donc j'ai pris la date, mais j'ai virtualisé la table en utilisant trois copies de façon à obtenir des agrégats indépendants les unes des autres.

Enjoy! ;)

______________________________________________________________
Une question bien formulée, c'est un problème bien compris : ça représente déjà les 3/4 de la réponse ;)

Options: ReplyQuote


Subject
Views
Written By
Posted
6526
February 26, 2008 08:48AM
Re: requete Mysql, besoin d'aide
3148
February 26, 2008 12:06PM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.