2 votes

SQL - Augmentation des prix au fil du temps

Je suis sûr que cette question a déjà reçu une réponse, mais je ne sais pas ce que je cherche.

J'ai des listes de prix qui sont mises à jour chaque mois et je cherche une requête qui liste tous les articles (tnr) dont le prix augmente de plus de 20%.

Dans ce cas, je voudrais le "tnr".

136234194430
832124069830
183078059150

Je pourrais parcourir en boucle tous les éléments, mais je sais qu'il existe un moyen plus intelligent, plus rapide et plus élégant de le faire.

La table factice pour tester des trucs

CREATE TABLE `pricelist` (
  `tnr` bigint(64) NOT NULL,
  `price` double NOT NULL,
  `discount` int(8) NOT NULL,
  `date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `pricelist` (`tnr`, `price`, `discount`, `date`) VALUES
(183078059150, 33.89, 26, '2018-08-01'),
(514780535750, 78.73, 19, '2018-08-01'),
(121475122010, 521.54, 16, '2018-08-01'),
(726576581300, 168.36, 10, '2018-08-01'),
(832124069830, 22.69, 50, '2018-08-01'),
(342122275110, 131.5, 26, '2018-08-01'),
(345067567690, 6.34, 26, '2018-08-01'),
(121113618790, 195.5, 16, '2018-08-01'),
(511681969780, 291.74, 23, '2018-08-01'),
(411372385450, 129.75, 23, '2018-08-01'),
(15097806600, 46.68, 19, '2018-08-01'),
(613592995940, 259.47, 19, '2018-08-01'),
(135414163780, 17, 19, '2018-08-01'),
(726076671410, 68.91, 11, '2018-08-01'),
(136234194430, 36.86, 23, '2018-08-01'),
(541122685800, 10.25, 16, '2018-08-01'),
(514722202230, 83.19, 23, '2018-08-01'),
(125177976530, 257.12, 26, '2018-08-01'),
(114377922120, 19.18, 23, '2018-08-01'),
(642169317400, 2.54, 26, '2018-08-01'),
(14085256200, 16.44, 14, '2018-08-01'),
(114313045460, 22.46, 16, '2018-08-01'),
(331014284930, 1042.02, 19, '2018-08-01'),
(183078059150, 53.89, 26, '2018-09-01'),
(514780535750, 78.73, 19, '2018-09-01'),
(121475122010, 521.54, 16, '2018-09-01'),
(726576581300, 168.36, 10, '2018-09-01'),
(832124069830, 42.69, 50, '2018-09-01'),
(342122275110, 131.5, 26, '2018-09-01'),
(345067567690, 6.34, 26, '2018-09-01'),
(121113618790, 195.5, 16, '2018-09-01'),
(511681969780, 291.74, 23, '2018-09-01'),
(411372385450, 129.75, 23, '2018-09-01'),
(15097806600, 46.68, 19, '2018-09-01'),
(613592995940, 259.47, 19, '2018-09-01'),
(135414163780, 17, 19, '2018-09-01'),
(726076671410, 68.91, 11, '2018-09-01'),
(136234194430, 66.86, 23, '2018-09-01'),
(541122685800, 10.25, 16, '2018-09-01'),
(514722202230, 83.19, 23, '2018-09-01'),
(125177976530, 257.12, 26, '2018-09-01'),
(114377922120, 19.18, 23, '2018-09-01'),
(642169317400, 2.54, 26, '2018-09-01'),
(14085256200, 16.44, 14, '2018-09-01'),
(114313045460, 22.46, 16, '2018-09-01'),
(331014284930, 1042.02, 19, '2018-09-01');

Merci beaucoup.

0voto

Madhur Bhaiya Points 128
  • Déterminer un " prix à terme " pour chaque tnr et chaque date (nouveau prix à une date ultérieure), en utilisant les éléments suivants Sous-requête corrélée .

  • Utilisation de Tableaux dérivés et le regroupement sur tnr filtrer (en utilisant la clause Having) les tnr ayant une "croissance" supérieure à 20 %.

Utilisez la requête suivante ( Démonstration de SQL Fiddle ):

SELECT inner_nest.tnr, 100*(inner_nest.forward_price - inner_nest.price)/inner_nest.price as growth
FROM 
(
  SELECT t1.*, (SELECT t2.price 
                FROM pricelist AS t2 
                WHERE t2.tnr = t1.tnr 
                  AND t2.date > t1.date 
                ORDER BY t2.date ASC LIMIT 1) AS forward_price 
  FROM pricelist AS t1
) AS inner_nest 
GROUP BY inner_nest.tnr 
HAVING growth > 20

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X