0
votes

Calculer plusieurs champs, y compris un champ nul

La requête de calcul ne fonctionne que lorsque tous les champs ont été remplis, elle peut calculer correctement la valeur 0 mais quand il y a une valeur NULL , elle ne renvoie aucun résultat

requête:

XXX

j'utilise round pour simplifier le résultat calculé jusqu'à 2 décimales seulement

table:

++++++++++++++++++++++++++++++++++++             ++++++++++++++++++++++++++++++++++++++++++++
| no | price_1 | price_2 | price_3 |             | no | price_1 | price_2 | price_3 | total |
++++++++++++++++++++++++++++++++++++             ++++++++++++++++++++++++++++++++++++++++++++
| 1  |   0.10  |  NULL   |  NULL   |  result =>  | 1  |   0.10  |  NULL   |  NULL   |  0.10 |
| 2  |   0.20  |    0    |    0    |             | 2  |   0.20  |    0    |    0    |  0.20 |
| 3  |   0.30  |   0.20  |   0.50  |             | 3  |   0.30  |   0.20  |   0.50  |  1.00 |
++++++++++++++++++++++++++++++++++++             ++++++++++++++++++++++++++++++++++++++++++++

résultat que je recherche pour:

++++++++++++++++++++++++++++++++++++             ++++++++++++++++++++++++++++++++++++++++++++
| no | price_1 | price_2 | price_3 |             | no | price_1 | price_2 | price_3 | total |
++++++++++++++++++++++++++++++++++++             ++++++++++++++++++++++++++++++++++++++++++++
| 1  |   0.10  |  NULL   |  NULL   |  result =>  | 1  |   0.10  |  NULL   |  NULL   |       |
| 2  |   0.20  |    0    |    0    |             | 2  |   0.20  |    0    |    0    |  0.20 |
| 3  |   0.30  |   0.20  |   0.50  |             | 3  |   0.30  |   0.20  |   0.50  |  1.00 |
++++++++++++++++++++++++++++++++++++             ++++++++++++++++++++++++++++++++++++++++++++

ma question est sur la ligne n ° 1, le champ total ne montre aucun résultat, car la valeur de price_2 et / ou price_3 est NULL, comment faire la requête pour calculer correctement tout le champ price_, y compris la valeur NULL?


2 commentaires

Pourquoi utilisez-vous GROUP BY ? Quelle est ta question?


ma question est sur la ligne n ° 1, le champ total ne montre aucun résultat, car la valeur de price_2 et / ou price_3 est NULL, comment faire la requête pour calculer correctement tout le champ price_, y compris la valeur NULL?, si vous n'utilisez pas groupé par, il n'affichera qu'une seule ligne sur le résultat de la requête


3 Réponses :


1
votes

Vous devez appliquer coalesce sur chaque colonne séparément. Ajout de NULL , et une autre valeur sera évaluée à NULL , et vous risquez de vous retrouver avec 0 (puisque coalesce (..., 0) code> est ce que vous avez spécifié) à chaque fois.

Essayez de fusionner chaque colonne du calcul:

round(coalesce(price_1, 0) + coalesce(price_2, 0) + coalesce(price_3, 0),2) AS total


0 commentaires

1
votes

Vous aviez peut-être l'intention d'utiliser COALESCE sur chacun des trois prix distincts:

SELECT
    no,
    price_1,
    price_2,
    price_3,
    ROUND(COALESCE(price_1, 0) + COALESCE(price_2, 0) + COALESCE(price_3, 0), 2) AS total
FROM price_table;

Remarque: je ne vois aucune raison d'utiliser GROUP BY ici du tout, car vous ne sélectionnez aucun agrégat. En fait, votre requête actuelle est une utilisation incorrecte de GROUP BY .


0 commentaires

1
votes

Oui, cela semble être un problème avec la façon dont vous utilisez null. La réponse finale sera nulle, car tout ce qui est combiné avec null est toujours nul. Correct revient à votre définition de correct ici. Que voulez-vous qu'il se passe?

Si vous voulez que mysql traite les valeurs nulles comme des zéros, alors vous devrez utiliser coalesce sur chacune des colonnes sur lesquelles vous souhaitez que cela se produise. Dans votre requête, cela ressemblerait à ceci:

    SELECT no,
   price_1,
   price_2,
   price_3,
   coalesce(round(
                        coalesce(price_1, 0) +
                        coalesce(price_2, 0) +
                        coalesce(price_3, 0)
                        2), 0) AS total
from price_table

Je suis à peu près sûr que le groupe de va générer une erreur, car vous ne résumez pas ici. Si vous faisiez sum (price_2), alors le groupe par serait correct.


4 commentaires

Non, le GROUP BY n'aurait toujours pas été OK, même en sélectionnant la somme, car les colonnes de prix individuelles n'apparaissent pas également dans la liste group by.


Je pense que vous vous trompez. Je dis que si OP devait utiliser des fonctions d'agrégation sur les prix, comme sum (price_2), ce serait bien.


Je dis que c'est une requête valide: SELECT no, sum (price_1), sum (price_2), sum (price_3) from price_table group by no


D'accord, c'est valable :-)