Archives de la liste a​i​d​e​@p​a​h​e​k​o​.c​l​o​u​d​

SQL: utilisation de SUM

Eric Piquot

04/08/2022 09:39:37

Bonjour,

Je cherche à afficher, en regard de chaque membre, le cumul des 
tantièmes. J'utilise la requête suivante:

SELECT
    nom, tantiemes, sum(tantiemes) AS Cumul
FROM membres
WHERE id_category = 1
ORDER BY nom
;

La requête s'arrête au 1er membre de l'association, ce qui n'est pas 
vraiment le but cherché ...


Mais ce serait _encore mieux_ d'obtenir la présentation ci-dessous !

Nom        Tantièmes

Avion        12345
...
...
...

Zoo           54321

TOTAL     100000

Merci d'avance !

SQL: utilisation de SUM

BohwaZ/Garradin

05/08/2022 02:50:36

Quand tu utilise SUM() c'est que tu veux le total.

Donc ça te donne une seule ligne, avec le total de tout, et du coup ça
prend la première ligne du résultat pour les autres colonnes.

Si tu veux un total *par membre*, il faut utiliser une clause GROUP BY:

SELECT
    nom, tantiemes, sum(tantiemes) AS Cumul
FROM membres
WHERE id_category = 1
GROUP BY id
ORDER BY nom;

Si tu veux le total par membre ET le total total il faut faire deux
requêtes qui se rejoignent avec une union :

SELECT
  nom AS nom,
  tantiemes AS 'Tantièmes',
  SUM(tantiemes) AS 'Cumul tantièmes'
FROM membres
WHERE id_category = 1
GROUP BY id
ORDER BY nom

UNION ALL

SELECT 'Total', NULL, SUM(tantiemes)
FROM membres
WHERE id_category = 1;

SQL: utilisation de SUM

eric.piquot

05/08/2022 08:33:50

Chacune des 2 requêtes (avant et après le UNION ALL) fonctionne effectivement,
 mais les 2 ensemble donnent: "ORDER BY clause should come after UNION ALL not
before".
Moi je sèche, et je ne suis pas le seul ...
Merci de ta persévérence.

On 05/08/2022 02:50, "BohwaZ/Garradin" <bohwaz@garradin.eu> wrote:
> Quand tu utilise SUM() c'est que tu veux le total.
> 
> Donc ça te donne une seule ligne, avec le total de tout, et du coup ça
> prend la première ligne du résultat pour les autres colonnes.
> 
> Si tu veux un total *par membre*, il faut utiliser une clause GROUP BY:
> 
> SELECT
>      nom, tantiemes, sum(tantiemes) AS Cumul
> FROM membres
> WHERE id_category = 1
> GROUP BY id
> ORDER BY nom;
> 
> Si tu veux le total par membre ET le total total il faut faire deux
> requêtes qui se rejoignent avec une union :
> 
> SELECT
>    nom AS nom,
>    tantiemes AS 'Tantièmes',
>    SUM(tantiemes) AS 'Cumul tantièmes'
> FROM membres
> WHERE id_category = 1
> GROUP BY id
> ORDER BY nom
> 
> UNION ALL
> 
> SELECT 'Total', NULL, SUM(tantiemes)
> FROM membres
> WHERE id_category = 1;
> 
>

SQL: utilisation de SUM

BohwaZ/Garradin

05/08/2022 13:59:44

> Chacune des 2 requêtes (avant et après le UNION ALL) fonctionne
> effectivement, mais les 2 ensemble donnent: "ORDER BY clause should
> come after UNION ALL not before". Moi je sèche, et je ne suis pas le
> seul ... Merci de ta persévérence.

Comme le dit le message : il faut déplacer le ORDER BY à la fin.

SELECT
  nom AS nom,
  tantiemes AS 'Tantièmes',
  SUM(tantiemes) AS 'Cumul tantièmes'
FROM membres
WHERE id_category = 1
GROUP BY id

UNION ALL

SELECT 'Total' AS nom, NULL, SUM(tantiemes)
FROM membres
WHERE id_category = 1
ORDER BY nom = 'Total', nom;

SQL: utilisation de SUM

eric.piquot

06/08/2022 08:45:45

On 05/08/2022 13:59, "BohwaZ/Garradin" <bohwaz@garradin.eu> wrote:
> > Chacune des 2 requêtes (avant et après le UNION ALL) fonctionne
> > effectivement, mais les 2 ensemble donnent: "ORDER BY clause should
> > come after UNION ALL not before". Moi je sèche, et je ne suis pas
le
> > seul ... Merci de ta persévérence.
> 
> Comme le dit le message : il faut déplacer le ORDER BY à la fin.
> 
> SELECT
>    nom AS nom,
>    tantiemes AS 'Tantièmes',
>    SUM(tantiemes) AS 'Cumul tantièmes'
> FROM membres
> WHERE id_category = 1
> GROUP BY id
> 
> UNION ALL
> 
> SELECT 'Total' AS nom, NULL, SUM(tantiemes)
> FROM membres
> WHERE id_category = 1
> ORDER BY nom = 'Total', nom;
> 
> 
Merci BohwaZ,
Malheureusement, cette requête génère le message: "1st ORDER BY term does not
match any column in the result set"

Ecrite avec mes pieds (heureusement il n'y a que 29 membres ...), la requête
suivante positionne les TOTAUX en dernière ligne et présente les membres dans
l'ordre alphabétique.
(reste le pb du 81 que je n'arrive pas à afficher en 81.00):

SELECT
  nom AS Nom,
  tantiemes AS 'Tantièmes',
   round(191600.*tantiemes/1000000.)/100. AS BP_perso,
   round((150000.)*tantiemes/1000000.)/100. AS GrosTravaux_perso,
   round((191600.)*tantiemes/1000000.)/100. + round((150000.)*tantiemes/1000000.)/100. AS
TOTAL_perso
 FROM membres
WHERE id_category = 1
GROUP BY nom

UNION ALL

SELECT 'TOTAUX' AS nom,
 SUM(tantiemes),
 SUM(round(191600.*tantiemes/1000000.)/100.),
 SUM(round((150000.)*tantiemes/1000000.)/100.), 
SUM(round((191600.)*tantiemes/1000000.)/100. + round((150000.)*tantiemes/1000000.)/100.)
FROM membres
;

Cordialement

SQL: utilisation de SUM

BohwaZ/Garradin

06/08/2022 22:22:50

Alors met juste :

ORDER BY nom;

Mais je ne peux pas écrire tes requêtes à ta place non plus ;)

SQL: utilisation de SUM

eric.piquot

07/08/2022 15:37:23

J'ai vu. Tu as bien raison ;)

On 06/08/2022 22:22, "BohwaZ/Garradin" <bohwaz@garradin.eu> wrote:
> Alors met juste :
> 
> ORDER BY nom;
> 
> Mais je ne peux pas écrire tes requêtes à ta place non plus ;)
> 
>