Pour MySQL, j'ai besoin d'un rapport des lignes qui s'écartent de plus d'un écart type par rapport à la moyenne (exprimée en pourcentage)
P粉002572690
P粉002572690 2023-09-13 22:06:57
0
1
585

J'essaie d'écrire une requête MySQL pour compter les lignes qui sont significativement différentes de la ligne la plus courante pour chaque produit et signaler la différence en pourcentage, où en dessous de 100 % le prix est inférieur au prix moyen de ce produit et supérieur à 100 % . Les prix inférieurs à 1 écart type par rapport à la moyenne sont ignorés.

Exemples de données :

_rowid _Horodatage Code fk_product_id fk_po_id Coût
5952 2021-01-10 10:19:01 00805 1367 543 0.850
9403 2022-05-23 14:54:34 00805 1367 2942 0.850
41595 2022-11-23 11:20:26 00805 1367 3391 1.350
39635 2022-01-18 12:49:32 Eau 1 344 3153 0,140
40134 2022-04-06 22:39:34 Eau 1 344 2747 0,190
41676 2022-12-09 16:28:28 Eau 1 344 3398 0,140
39634 2022-01-18 12:49:31 gr309203 344400 1024 3154 0.770
35634 2021-03-03 15:23:23 gr309203 344400 1024 3203 0.790
41264 2022-11-16 11:41:44 gr309203 344400 1024 3357 0.970
SELECT code, fk_product_id, cost, cost/
  (SELECT avg(cost) FROM po_line aa WHERE aa.code = code) AS percent 
FROM po_line 
WHERE (SELECT STDDEV(cost) FROM po_line ss WHERE ss.code = code)>1;

Cela ne renverra aucune ligne, mais trois lignes (une pour chaque produit) devraient apparaître dans le rapport.

Le résultat attendu devrait être :

Code fk_product_id Coût Pourcentage
00805 1367 1.350 133
Eau 1 344 0,190 121
gr309203 344400 1024 0.970 115

P粉002572690
P粉002572690

répondre à tous(1)
P粉141911244

Cette requête montre comment utiliser les fonctions de fenêtre pour calculer le nombre d'écarts types et le coût en pourcentage du coût moyen pour chaque code donné.

SELECT code, cost, avg, std, 
  ABS(cost-avg)/std AS num_std, 
  cost*100/avg AS pct
FROM (
  SELECT code, cost,
    AVG(cost) OVER (PARTITION BY code) AS avg,
    STDDEV(cost) OVER (PARTITION BY code) AS std
  FROM po_line
) AS p;

Résultat :

+-----------------+-------+-----------+---------------------+--------------------+-------------+
| code            | cost  | avg       | std                 | num_std            | pct         |
+-----------------+-------+-----------+---------------------+--------------------+-------------+
| 00805           | 0.850 | 1.0166667 | 0.23570226039551592 | 0.7071069226079035 |  83.6065546 |
| 00805           | 0.850 | 1.0166667 | 0.23570226039551592 | 0.7071069226079035 |  83.6065546 |
| 00805           | 1.350 | 1.0166667 | 0.23570226039551592 | 1.4142134209517383 | 132.7868809 |
| gr309203 344400 | 0.770 | 0.8433333 |  0.0899382504215469 | 0.8153738777025533 |  91.3043514 |
| gr309203 344400 | 0.790 | 0.8433333 |  0.0899382504215469 | 0.5929990827042229 |  93.6758930 |
| gr309203 344400 | 0.970 | 0.8433333 |  0.0899382504215469 | 1.4083740722807512 | 115.0197674 |
| Water1          | 0.140 | 0.1566667 | 0.02357022603955158 | 0.7071081954001099 |  89.3616831 |
| Water1          | 0.190 | 0.1566667 | 0.02357022603955158 | 1.4142121481595331 | 121.2765699 |
| Water1          | 0.140 | 0.1566667 | 0.02357022603955158 | 0.7071081954001099 |  89.3616831 |
+-----------------+-------+-----------+---------------------+--------------------+-------------+

(Veuillez noter que les fonctions de fenêtre nécessitent MySQL 8.0).

Cette requête vous montre uniquement comment le calcul est effectué. Pour obtenir les résultats souhaités :

SELECT code, fk_product_id, cost, ROUND(cost*100/avg) AS pct
FROM (
  SELECT code, cost, fk_product_id,
    AVG(cost) OVER (PARTITION BY code) AS avg,
    STDDEV(cost) OVER (PARTITION BY code) AS std
  FROM po_line
) AS p
WHERE ABS(cost-avg)/std > 1;

+-----------------+---------------+-------+------+
| code            | fk_product_id | cost  | pct  |
+-----------------+---------------+-------+------+
| 00805           |          1367 | 1.350 |  133 |
| gr309203 344400 |          1024 | 0.970 |  115 |
| Water1          |           344 | 0.190 |  121 |
+-----------------+---------------+-------+------+
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!