Somme conditionnelle dans une requete sql
Résolu
mont_dani
Messages postés
232
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour
J'ai une table du type
avec les données suivantes
date PAIS_1 NB_1 PAIS_2 NB_2 PAIS_3 NB_3
15/10/2020 ESPAGNE 15 ITALIE 10 IRLANDE 5
25/04/2020 ALLEMAGNE 20 ESPAGNE 15 IRLANDE 10
04/03/2021 FRANCE 30 ITALIE 24 ALLEMAGNE 20
10/10/2020 SUISSE 50 FRANCE 45 ESPAGNE 25
04/12/2021 ITALIE 30 IRLANDE 25 ALLEMAGNE 20
jE VOUDRAIS FAIRE LA SOMME DE NB.. PAR PAIS... ET PAR AÑO ORDONNEE DU PLUS GRAND VERS LE PLUS PETIT
JE VEUX DIRE
ANNEE COUNTRY_1 TOTAL_1 COUNTRY_2 TOTAL_2 COUNTRY_3 TOTAL_3
2020 ESPAGNE 55 FRANCE 45 IRLANDE 15
2021 ITALIE 54 ALLEMAGNE 40 FRANCE 30
quelqu'un pourrait-il me donner un coup de main pour cette requete? Merci d'avance.
J'ai une table du type
PAIS_1 text utf8_general_ci Sí NULL NB_1 int(11) Sí NULL PAIS_2 text utf8_general_ci Sí NULL NB_2 int(11) Sí NULL PAIS_3 text utf8_general_ci Sí NULL NB_2 int(11) Sí NULL
avec les données suivantes
date PAIS_1 NB_1 PAIS_2 NB_2 PAIS_3 NB_3
15/10/2020 ESPAGNE 15 ITALIE 10 IRLANDE 5
25/04/2020 ALLEMAGNE 20 ESPAGNE 15 IRLANDE 10
04/03/2021 FRANCE 30 ITALIE 24 ALLEMAGNE 20
10/10/2020 SUISSE 50 FRANCE 45 ESPAGNE 25
04/12/2021 ITALIE 30 IRLANDE 25 ALLEMAGNE 20
jE VOUDRAIS FAIRE LA SOMME DE NB.. PAR PAIS... ET PAR AÑO ORDONNEE DU PLUS GRAND VERS LE PLUS PETIT
JE VEUX DIRE
ANNEE COUNTRY_1 TOTAL_1 COUNTRY_2 TOTAL_2 COUNTRY_3 TOTAL_3
2020 ESPAGNE 55 FRANCE 45 IRLANDE 15
2021 ITALIE 54 ALLEMAGNE 40 FRANCE 30
quelqu'un pourrait-il me donner un coup de main pour cette requete? Merci d'avance.
A voir également:
- Sql somme
- Formule somme excel colonne - Guide
- Somme si couleur - Guide
- Somme en anglais excel - Guide
- Logiciel sql - Télécharger - Bases de données
- Somme si ens ou ✓ - Forum Excel
13 réponses
Bonjour,
Déjà, ta question concernant une requête SQL et non un problème de langage PHP... je la déplace dans le bon forum.
Ensuite,
Il va te falloir faire trois requêtes via l'instruction UNION
Une par Pays/NB
Pour ça, tu vas devoir utiliser l'instruction GROUP BY et la fonction SUM
Je te laisse essayer ... et reviens nous montrer ce que tu auras tenté pour qu'on t'aide à corriger si besoin.
Déjà, ta question concernant une requête SQL et non un problème de langage PHP... je la déplace dans le bon forum.
Ensuite,
Il va te falloir faire trois requêtes via l'instruction UNION
Une par Pays/NB
Pour ça, tu vas devoir utiliser l'instruction GROUP BY et la fonction SUM
Je te laisse essayer ... et reviens nous montrer ce que tu auras tenté pour qu'on t'aide à corriger si besoin.
Voici la requete SQL pour obtenir les données.
qui fonctionne bien en retournant tout les résultats.
Comment faire pour faire la somme correspondante a chaque "pays" par année?
J'ai essayer:
mais cela ne marche pas.
Je suppose que le problème vient de SELECT COUNTRY, SUM(QU) ... mais je ne sias pas comment le résoudre
SELECT YEAR(DATE), PAIS_1 AS COUNTRY,NB_1 AS QU FROM camino UNION SELECT YEAR(DATE),PAIS_2 AS COUNTRY,NB_2 AS QU FROM camino UNION SELECT YEAR(DATE),PAIS_3 AS COUNTRY,NB_3 AS QU FROM camino )
qui fonctionne bien en retournant tout les résultats.
Comment faire pour faire la somme correspondante a chaque "pays" par année?
J'ai essayer:
SELECT COUNTRY, SUM(QU) FROM ( SELECT YEAR(DATE), PAIS_1 AS COUNTRY,NB_1 AS QU FROM camino UNION SELECT YEAR(DATE),PAIS_2 AS COUNTRY,NB_2 AS QU FROM camino UNION SELECT YEAR(DATE),PAIS_3 AS COUNTRY,NB_3 AS QU FROM camino ) GROUP BY COUNTRY
mais cela ne marche pas.
Je suppose que le problème vient de SELECT COUNTRY, SUM(QU) ... mais je ne sias pas comment le résoudre
j'ai cette fait cela qui fonctionne bien
J'ai un petit probleme avec ORDCER BY
Je voudrai afficher pour chaque ANNEE les cinq plus grand Total.
Dans ma requete le "LIMIT 5" s'applique a "ANNEE". Comment dois-je faire pour qu-il s'applique a TOTAL?
Merci pour ton soutien.
SELECT RESUME.D AS ANNEE, RESUME.COUNTRY AS PAIS, SUM(RESUME.QU) AS TOTAL FROM ( SELECT YEAR(DATE) AS D, PAIS_1 AS COUNTRY,NB_1 AS QU FROM camino UNION SELECT YEAR(DATE) AS D,PAIS_2 AS COUNTRY,NB_2 AS QU FROM camino UNION SELECT YEAR(DATE) AS D,PAIS_3 AS COUNTRY,NB_3 AS QU FROM camino ) AS RESUME GROUP BY ANNEE, PAIS ORDER BY ANNEE DESC, TOTAL DESC LIMIT 5
J'ai un petit probleme avec ORDCER BY
Je voudrai afficher pour chaque ANNEE les cinq plus grand Total.
Dans ma requete le "LIMIT 5" s'applique a "ANNEE". Comment dois-je faire pour qu-il s'applique a TOTAL?
Merci pour ton soutien.
si tu repars de ce que tu as fait en #4, et que tu le sauves en l'appelant "dani", je pense que tu dois faire ainsi pour obtenir le résultat attendu:
EDIT: ce que tu as fait en #4, sans le LIMIT.
SELECT d.annee, d.pays, d.total FROM dani as d WHERE d.annee & d.pays in (select top 5 annee & pays from dani where dani.annee = d.annee order by total desc) ORDER BY d.annee, d.total DESC;
EDIT: ce que tu as fait en #4, sans le LIMIT.
J AI UNE ERREUR ·1064 AVEC CETTE REQUETE
SELECT RESUME.D AS ANNEE, RESUME.COUNTRY AS PAIS, SUM(RESUME.QU) AS TOTAL FROM ( SELECT YEAR(DATE) AS D, PAIS_1 AS COUNTRY,NB_1 AS QU FROM camino GRUUP BY D, COUNTRY ORDER BY D DESC, QU DESC LIMIT 5 UNION SELECT YEAR(DATE) AS D, PAIS_2 AS COUNTRY,NB_2 AS QU FROM camino GROUP BY D, COUNTRY ORDER BY D DESC QU DESC LIMIT 5 UNION SELECT YEAR(DATE) AS D, PAIS_3 AS COUNTRY,NB_3 AS QU FROM camino GROUP BY D, COUNTRY ORDER BY D DESC QU DESC LIMIT 5 ) AS RESUME
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour yg_be
Merci pour ton soutien.
voici ma derniere requete qui fonctionne
Mais quand je veux extraire seulement les 5 plus grands résultats de QU, avec cette requette, j'obtient tout les résultat et non les 5 plus grands de chaqe année
Je n'ai plus d'erreur
Merci pour ton soutien.
voici ma derniere requete qui fonctionne
SELECT RESUME.D AS ANNEE, RESUME.COUNTRY AS PAIS, SUM(RESUME.QU) AS TOTAL FROM ( SELECT YEAR(DATE) AS D, PAIS_1 AS COUNTRY,NB_1 AS QU FROM camino UNION SELECT YEAR(DATE) AS D,PAIS_2 AS COUNTRY,NB_2 AS QU FROM camino UNION SELECT YEAR(DATE) AS D,PAIS_3 AS COUNTRY,NB_3 AS QU FROM camino ) AS RESUME GROUP BY ANNEE, PAIS ORDER BY ANNEE DESC, TOTAL DESC
Mais quand je veux extraire seulement les 5 plus grands résultats de QU, avec cette requette, j'obtient tout les résultat et non les 5 plus grands de chaqe année
SELECT RESUME.D AS ANNEE, RESUME.COUNTRY AS PAIS, SUM(RESUME.QU) AS TOTAL FROM ( (SELECT YEAR(DATE) AS D, PAIS_1 AS COUNTRY, NB_1 AS QU FROM camino GROUP BY COUNTRY ORDER BY D DESC, QU DESC LIMIT 5) UNION (SELECT YEAR(DATE) AS D,PAIS_2 AS COUNTRY, NB_2 AS QU FROM camino GROUP BY COUNTRY ORDER BY D DESC, QU DESC LIMIT 5) UNION (SELECT YEAR(DATE) AS D,PAIS_3 AS COUNTRY, NB_3 AS QU FROM camino GROUP BY COUNTRY ORDER BY D DESC, QU DESC LIMIT 5) ) AS RESUME GROUP BY ANNEE, PAIS ORDER BY ANNEE DESC, TOTAL DESC
Je n'ai plus d'erreur
Opus je ne comprend pas ce que tu me dis:
"si tu repars de ce que tu as fait en #4, et que tu le sauves en l'appelant "dani", je pense que tu dois faire ainsi pour obtenir le résultat attendu:"
Voici ce a quoi je suis arrivé qui ne limite pas a 5 le nombre de COUNTRY / TOTAL pour chaque ANNEE
et je ne sais pas quoi faire avec ta requette.
Peut-tu m'expliquer un peu plus?
"si tu repars de ce que tu as fait en #4, et que tu le sauves en l'appelant "dani", je pense que tu dois faire ainsi pour obtenir le résultat attendu:"
SELECT d.annee, d.pays, d.total FROM dani as d WHERE d.annee & d.pays in (select top 5 annee & pays from dani where dani.annee = d.annee order by total desc) ORDER BY d.annee, d.total DESC;
Voici ce a quoi je suis arrivé qui ne limite pas a 5 le nombre de COUNTRY / TOTAL pour chaque ANNEE
SELECT RESUME.D AS ANNEE, RESUME.COUNTRY AS PAIS, SUM(RESUME.QU) AS TOTAL FROM ( (SELECT YEAR(DATE) AS D, PAIS_1 AS COUNTRY, NB_1 AS QU FROM camino GROUP BY COUNTRY ORDER BY D DESC, QU DESC LIMIT 5) UNION (SELECT YEAR(DATE) AS D,PAIS_2 AS COUNTRY, NB_2 AS QU FROM camino GROUP BY COUNTRY ORDER BY D DESC, QU DESC LIMIT 5) UNION (SELECT YEAR(DATE) AS D,PAIS_3 AS COUNTRY, NB_3 AS QU FROM camino GROUP BY COUNTRY ORDER BY D DESC, QU DESC LIMIT 5) ) AS RESUME GROUP BY ANNEE, PAIS ORDER BY ANNEE DESC, TOTAL DESC
et je ne sais pas quoi faire avec ta requette.
Peut-tu m'expliquer un peu plus?
Tu es arrivé à une requête qui te donne tous les résultats, et tu souhaites réutiliser cette requête et n'en garder que 5 par année.
Pour cela, je suggère que tu crées une "view", ce qui permet de mémoriser et de nommer la requête, et d'ensuite la réutiliser un peu comme si c'était une table.
exemple:
Ensuite, tu testes ma suggestion.
Pour cela, je suggère que tu crées une "view", ce qui permet de mémoriser et de nommer la requête, et d'ensuite la réutiliser un peu comme si c'était une table.
exemple:
CREATE VIEW dani AS SELECT RESUME.D AS ANNEE, RESUME.COUNTRY AS PAYS, SUM(RESUME.QU) AS TOTAL FROM ( (SELECT YEAR(DATE) AS D, PAIS_1 AS COUNTRY, NB_1 AS QU FROM camino GROUP BY COUNTRY ORDER BY D DESC, QU DESC LIMIT 5) UNION (SELECT YEAR(DATE) AS D,PAIS_2 AS COUNTRY, NB_2 AS QU FROM camino GROUP BY COUNTRY ORDER BY D DESC, QU DESC LIMIT 5) UNION (SELECT YEAR(DATE) AS D,PAIS_3 AS COUNTRY, NB_3 AS QU FROM camino GROUP BY COUNTRY ORDER BY D DESC, QU DESC LIMIT 5) ) AS RESUME GROUP BY ANNEE, PAIS
Ensuite, tu testes ma suggestion.
C'est tès bien et j'ai bien compris que je crée une nouvelle table.
Mais en réalité j'ai fait une grosse erreur et je m'en excuse.
Je m'explique:
J'extrait mes données et j'obtient:
ANNEE PAYS TOTAL
2022 FRANCE 2155
2022 ESPAGNE 1952
2022 PORTUGAL 1854
2022 SUISSE 1741
2022 ITALIE 1562
2022 USA 1322
2022 JAPON 1100
2021 ESPAGNE 2014 ect...
alors que ce dont ja'i besoin c'est ce resultat:
ANNEE PAYS_1 TOTAL_1 PAYS_2 TOTAL_2 PAYS_3 TOTAL_3 PAYS_4 TOTAL_4 PAYS_5 TOTAL_5
2022 FRANCE 2155 ESPAGNE 1952 PORTUGAL 1854 SUISSE 1741 2 ITALIE 1562
2021 ESPAGNE 2014 ect...
DONC a partir d ela table créée je fait cette requette pour le plus grand TOTAL
Et celle ci pour le second plus grand
et ainsi de suite
comment dois-je faire pour imbriquer ces requettes et obtenir le resultat souhaité ? Peux-tu me donner une ligne directrice.
Mais en réalité j'ai fait une grosse erreur et je m'en excuse.
Je m'explique:
J'extrait mes données et j'obtient:
ANNEE PAYS TOTAL
2022 FRANCE 2155
2022 ESPAGNE 1952
2022 PORTUGAL 1854
2022 SUISSE 1741
2022 ITALIE 1562
2022 USA 1322
2022 JAPON 1100
2021 ESPAGNE 2014 ect...
alors que ce dont ja'i besoin c'est ce resultat:
ANNEE PAYS_1 TOTAL_1 PAYS_2 TOTAL_2 PAYS_3 TOTAL_3 PAYS_4 TOTAL_4 PAYS_5 TOTAL_5
2022 FRANCE 2155 ESPAGNE 1952 PORTUGAL 1854 SUISSE 1741 2 ITALIE 1562
2021 ESPAGNE 2014 ect...
DONC a partir d ela table créée je fait cette requette pour le plus grand TOTAL
SELECT ANNEE, PAYS, MAX(TOTAL) AS PREM FROM resultat
Et celle ci pour le second plus grand
SELECT ANNEE, PAYS, MAX(TOTAL) AS PREM FROM resultat WHERE TOTAL < ( SELECT MAX( TOTAL) FROM resultat )
et ainsi de suite
comment dois-je faire pour imbriquer ces requettes et obtenir le resultat souhaité ? Peux-tu me donner une ligne directrice.
peut-être:
create view r1 as SELECT ANNEE, PAYS, MAX(TOTAL) AS PREM FROM resultat WHERE TOTAL < ( SELECT MAX( TOTAL) FROM resultat )
create view r2 as SELECT ANNEE, PAYS, MAX(TOTAL) AS PREM FROM resultat WHERE TOTAL < ( SELECT MAX( TOTAL) FROM resultat )
select r1.annee, r1.pays, r1.prem , r2.pays, r2.prem from r1 , r2 where r1.annee = r2.annee
comme tu l'as vu, j'ai tenter une autre route pour obtenir mon tableau. parceque j'ai essayer en vain de l'obetenir avec des requettes.
Je veux obtenir les 5 premiers resultat de chaque annee de ma table resultat
Pour le premier pas de souci.
pour le second, j'ai fait
Mais j'obtient :
le premier de l'annee 2022
le seconde de l'annee 2021
le premier de l'annee 2022
J'ai essayer d'autres requette mais en vain.
Saurais-tu me dire ce que je dois faire?
Je veux obtenir les 5 premiers resultat de chaque annee de ma table resultat
Pour le premier pas de souci.
pour le second, j'ai fait
create view r2 as SELECT ANNEE, PAYS, MAX(TOTAL) AS PREM FROM resultat WHERE TOTAL < ( SELECT MAX( TOTAL) FROM resultat ) GROUP BY ANNEE ORDER BY ANNEE DESC
Mais j'obtient :
le premier de l'annee 2022
le seconde de l'annee 2021
le premier de l'annee 2022
J'ai essayer d'autres requette mais en vain.
Saurais-tu me dire ce que je dois faire?
Oui ma requette me donne
ANNEE PAYS TOTAL
2022 Argentina 1670
2022 Japón 1499
2022 Gabón 1463
2022 Argelia 1380
2022 Jamaica 1162
2022 Haití 99
2022 Ciudad del Vaticano 30
2022 Albania 22
2022 Laos 11
2021 ES 3000
2021 FR 2800
2021 FRANCE 222
2021 Tailandia 99
2021 NULL 55
2021 Haití 55
2021 Japón 9
2021 Argelia 5
2021 0 0
2020 Japón 453
et je veux obtenir
ANNEE PAIS 1 QU 1 PAIS 2 QU 2 PAIS 3 QU 3 PAIS 4 QU 4 PAIS 5 QU 5
2022 ARGENTINA 1670 JAPON 1499 Gabón 1463 Argelia 1380 Jamaica 1162
2021 ES 3000 FR 2800 FRANCE 222 Taillandia 99 Null 55
2020 japon 453 THAIL 99 JAMAICA 55
ANNEE PAYS TOTAL
2022 Argentina 1670
2022 Japón 1499
2022 Gabón 1463
2022 Argelia 1380
2022 Jamaica 1162
2022 Haití 99
2022 Ciudad del Vaticano 30
2022 Albania 22
2022 Laos 11
2021 ES 3000
2021 FR 2800
2021 FRANCE 222
2021 Tailandia 99
2021 NULL 55
2021 Haití 55
2021 Japón 9
2021 Argelia 5
2021 0 0
2020 Japón 453
et je veux obtenir
ANNEE PAIS 1 QU 1 PAIS 2 QU 2 PAIS 3 QU 3 PAIS 4 QU 4 PAIS 5 QU 5
2022 ARGENTINA 1670 JAPON 1499 Gabón 1463 Argelia 1380 Jamaica 1162
2021 ES 3000 FR 2800 FRANCE 222 Taillandia 99 Null 55
2020 japon 453 THAIL 99 JAMAICA 55
Oui rangé dans une VIEW resultat.
D'ailleurs j'ai utilisé lle même pricncipe de créé une VIEW pour extraire les plus grand resultat de chaque année
et cela fonctionne.
Mais pour obtenir le second plus grand avec cette requette c'est mon probleme.
j'obtient :
le premier de l'annee 2022
le seconde de l'annee 2021
le premier de l'annee 2022
D'ailleurs j'ai utilisé lle même pricncipe de créé une VIEW pour extraire les plus grand resultat de chaque année
CREATE VIEW top_1 AS (SELECT ANNEE, PAYS, TOTAL FROM resultat WHERE TOTAL IN (SELECT MAX(TOTAL)) GROUP BY ANNEE)
et cela fonctionne.
Mais pour obtenir le second plus grand avec cette requette c'est mon probleme.
CREATE VIEW top_2 AS (SELECT ANNEE, PAYS, TOTAL FROM resultat WHERE TOTAL IN (SELECT MAX(TOTAL) WHERE TOTAL < (SELECT MAX(TOTAL) FROM RESULTAT ) GROUP BY ANNEE ORDER BY ANNEE DESC)
j'obtient :
le premier de l'annee 2022
le seconde de l'annee 2021
le premier de l'annee 2022
OUI ET J'AVAIS CETTE ERREUR
#1064 - Algo está equivocado en su sintax cerca '5 ANNEE & PAYS from resultat as r
where r.ANNEE = d.ANNEE order by TOTAL desc)
' en la linea 3
#1064 - Algo está equivocado en su sintax cerca '5 ANNEE & PAYS from resultat as r
where r.ANNEE = d.ANNEE order by TOTAL desc)
' en la linea 3
Erreur #1235 - Esta versión de MySQL no soporta todavia 'LIMIT & IN/ALL/ANY/SOME subquery'
J'ai la version mysql 5-7-36 et j'ai verifier sur le site de WAMPSERVEUR, il s'agit de la derniere version
J'ai la version mysql 5-7-36 et j'ai verifier sur le site de WAMPSERVEUR, il s'agit de la derniere version