Le plus juste est de se baser sur la date de la commande et non sur des numéros dont la raison d'être est plutôt technique que métier.
Donc, la requête qui trouve les 2 dernières commande du client n°27 est la suivante:
SELECT id, date, montant FROM commandes WHERE id = 27 ORDER BY date DESC LIMIT 2
Et celle qui calcule l'écart entre les montants de ces commandes est :
DELIMITER |
CREATE PROCEDURE `ecart_commandes`(id_client INT)
BEGIN
DECLARE date1, date2 DATETIME;
DECLARE montant1, montant2, ecart FLOAT;
DECLARE comment VARCHAR(20);
DECLARE curseur1 CURSOR FOR SELECT c.date, c.montant FROM commandes c WHERE c.id = id_client ORDER BY c.date DESC LIMIT 2;
CREATE TABLE IF NOT EXISTS ecart_com (id_client int, date1 datetime, montant1 float, date2 datetime, montant2 float, ecart float, comment varchar(255));
OPEN curseur1;
FETCH curseur1 INTO date1, montant1;
FETCH curseur1 INTO date2, montant2;
SET ecart = montant1 - montant2;
IF montant1 = montant2 THEN
SET comment = 'Egalité';
ELSE
IF montant1 < montant2 THEN
SET comment = 'Diminution';
ELSE
SET comment = 'Augmentation';
END IF;
END IF;
INSERT INTO ecart_com (id_client, date1, montant1, date2, montant2, ecart, comment) VALUES (id_client, date1, montant1, date2, montant2, ecart, comment);
CLOSE curseur1;
END
Cette procédure stockée permet donc de lire le curseur de la requête qui sélectionne les 2 dernières commandes d'un client donné et de calculer l'écart entre les montants de ses commandes (en plus d'un commentaire sur l'écart)
Le résultat de calcul est inséré dans une table de résultat qu'on a nommée "ecart_com".
Pour exécuter cette procédure stockée pour le client n°27, il faut exécuter la requête suivante:
call ecart_commandes(27);
Voici la base de données de test que j'ai créée et testé:
-- phpMyAdmin SQL Dump
-- version 3.2.0.1
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Jeu 03 Septembre 2009 à 05:40
-- Version du serveur: 5.1.31
-- Version de PHP: 5.3.0
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de données: `test`
--
-- --------------------------------------------------------
--
-- Structure de la table `commandes`
--
CREATE TABLE IF NOT EXISTS `commandes` (
`id` int(11) NOT NULL,
`date` datetime NOT NULL,
`montant` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Contenu de la table `commandes`
--
INSERT INTO `commandes` (`id`, `date`, `montant`) VALUES
(27, '2009-08-10 07:17:21', 500),
(27, '2009-08-17 07:17:46', 400),
(27, '2009-09-01 07:18:16', 200);
-- --------------------------------------------------------
--
-- Structure de la table `ecart_com`
--
CREATE TABLE IF NOT EXISTS `ecart_com` (
`id_client` int(11) DEFAULT NULL,
`date1` datetime DEFAULT NULL,
`montant1` float DEFAULT NULL,
`date2` datetime DEFAULT NULL,
`montant2` float DEFAULT NULL,
`ecart` float DEFAULT NULL,
`comment` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DELIMITER $$
--
-- Procédures
--
CREATE DEFINER=`root`@`localhost` PROCEDURE `ecart_commandes`(id_client INT)
BEGIN
DECLARE date1, date2 DATETIME;
DECLARE montant1, montant2, ecart FLOAT;
DECLARE comment VARCHAR(20);
DECLARE curseur1 CURSOR FOR SELECT c.date, c.montant FROM commandes c WHERE c.id = id_client ORDER BY c.date DESC LIMIT 2;
CREATE TABLE IF NOT EXISTS ecart_com (id_client int, date1 datetime, montant1 float, date2 datetime, montant2 float, ecart float, comment varchar(255));
OPEN curseur1;
FETCH curseur1 INTO date1, montant1;
FETCH curseur1 INTO date2, montant2;
SET ecart = montant1 - montant2;
IF montant1 = montant2 THEN
SET comment = 'Egalité';
ELSE
IF montant1 < montant2 THEN
SET comment = 'Diminution';
ELSE
SET comment = 'Augmentation';
END IF;
END IF;
INSERT INTO ecart_com (id_client, date1, montant1, date2, montant2, ecart, comment) VALUES (id_client, date1, montant1, date2, montant2, ecart, comment);
CLOSE curseur1;
END$$
DELIMITER ;
D'après cet exemple, le résultat qu'on obtient dans la table des résultats qu'on a nommée "ecart_com" et qui est remplie par la procédure "ecart_commandes" pour le client n°27 est le suivant:
Code : Tout sélectionner
id_client date1 montant1 date2 montant2 ecart comment
27 2009-09-01 200 2009-08-17 400 200 Diminution