PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Problème SQL
Problème SQL
Débuté par Chambiges, 12 oct. 2017 21:15 - 13 réponses
Membre enregistré
86 messages
Popularité : +3 (3 votes)
Posté le 12 octobre 2017 - 21:15
Bonjour

Mon problème :
Je voudrais faire une requête avec une jointure sur 2 tables avec tous les enregistrements d'une table et seulement ceux de l'autre table pour les enregistrements égaux.
Voici mon code SQL généré :
SELECT
SUM(Ecritures.Recette) AS la_somme_Recette,
SUM(Ecritures.Dépense) AS la_somme_Dépense,
SUM(Ecritures.Recette -Ecritures.Dépense) AS Solde,
Num_compte.Libellé AS Libellé,
Ecritures.Compte AS Compte
FROM
Num_compte,
Ecritures
WHERE
Num_compte.Numéro_de_compte = Ecritures.Numéro_de_compte
AND
(
Ecritures.Date_Ecriture BETWEEN {ParamDateDébut} AND {ParamDateFin}
)
GROUP BY
Num_compte.Libellé,
Ecritures.Compte

Et là j'ai tous les enregistrements des 2 tables
Cordialement
Membre enregistré
86 messages
Popularité : +3 (3 votes)
Posté le 12 octobre 2017 - 21:50
J'ai oublié de préciser le liens entre les 2 tables :
Table Num_Compte 0,1 vers la table Ecritures 1,1.
Merci
Membre enregistré
2 568 messages
Popularité : +222 (260 votes)
Posté le 13 octobre 2017 - 05:01
Bonjour,

Tu as tous les enregistrements de la table Num_Compte alors que tu n'as pas d'enregistrements dans la table Ecritures ?

Essaye comme ça.
SELECT
SUM(Ecritures.Recette) AS la_somme_Recette,
SUM(Ecritures.Dépense) AS la_somme_Dépense,
SUM(Ecritures.Recette -Ecritures.Dépense) AS Solde,
Num_compte.Libellé AS Libellé,
Ecritures.Compte AS Compte
FROM
Ecritures, Num_compte
WHERE
Ecritures.Numéro_de_compte = Num_compte.Numéro_de_compte
AND
(
Ecritures.Date_Ecriture BETWEEN {ParamDateDébut} AND {ParamDateFin}
)
GROUP BY
Num_compte.Libellé,
Ecritures.Compte


--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Membre enregistré
86 messages
Popularité : +3 (3 votes)
Posté le 13 octobre 2017 - 08:23
Merci

Mais rien de changer
Posté le 13 octobre 2017 - 08:34
bonjour

au lieu de faire
WHERE
Num_compte.Numéro_de_compte = Ecritures.Numéro_de_compte

regarde en sql inner join

et dans ton cas left join
Membre enregistré
86 messages
Popularité : +3 (3 votes)
Posté le 13 octobre 2017 - 09:30
J'ai avancé je n'ai plus TOUS les enregistrements de la table Num_Compte, mais je n'ai QUE la somme du 1er enregistrement trouvé.
Voici mon nouveau code :
SELECT
Ecritures.Numéro_de_compte AS Numéro_de_compte,
SUM(Ecritures.Recette) AS la_somme_Recette,
SUM(Ecritures.Dépense) AS la_somme_Dépense,
SUM(( Ecritures.Recette - Ecritures.Dépense ) ) AS Solde,
Num_compte.Libellé AS Libellé
FROM
Num_compte,
Ecritures
WHERE
Num_compte.Numéro_de_compte = Ecritures.Numéro_de_compte
AND
(
Ecritures.Date_Ecriture BETWEEN {ParamDateDébut} AND {ParamDateFin}
)
GROUP BY
Num_compte.Libellé,
Ecritures.Numéro_de_compte
ORDER BY
Numéro_de_compte ASC

Merci pour votre aide
Message modifié, 13 octobre 2017 - 09:43
Membre enregistré
86 messages
Popularité : +3 (3 votes)
Posté le 13 octobre 2017 - 09:32
En fait il ne faudrait pas de regroupement sur le libellé mais seulement sur le champ "Ecritures.Numéro"_de_compte.
Ce que je n'arrive pas à faire.
En retirant le champ "Ecritures.Numéro" le regroupement se fait bien.
Message modifié, 13 octobre 2017 - 09:42
Membre enregistré
2 568 messages
Popularité : +222 (260 votes)
Posté le 13 octobre 2017 - 11:55
Ce n'est pas possible ou alors il te faut retirer le libellé de ta requête. Cependant pour pouvoir t'aider plus, il faudrait un échantillon de ce que tu obtiens et de ce que tu voudrais avoir

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 13 octobre 2017 - 12:53
bonjour

vous utilisez
where
Num_compte.Numéro_de_compte = Ecritures.Numéro_de_compte

pour la jointure au lieux de inner join

il faut regarder du cote de left join en sql pour avoir tout les enregistrements d'une table et ceux de l'autre table
Membre enregistré
86 messages
Popularité : +3 (3 votes)
Posté le 15 octobre 2017 - 07:59
Merci Philippe

En fait j'ai retiré le Numéro de compte, c'est le libellé qui est le plus important
Posté le 16 octobre 2017 - 13:36
ET comme cela?
SELECT
SUM(Ecritures.Recette) AS la_somme_Recette,
SUM(Ecritures.Dépense) AS la_somme_Dépense,
SUM(Ecritures.Recette -Ecritures.Dépense) AS Solde,
Num_compte.Libellé AS Libellé,
Ecritures.Compte AS Compte
FROM
Num_compte left Join Ecritures ON

(Num_compte.Numéro_de_compte = Ecritures.Numéro_de_compte
AND
(
Ecritures.Date_Ecriture BETWEEN {ParamDateDébut} AND {ParamDateFin}
))
GROUP BY
Num_compte.Libellé,
Ecritures.Compte

Michel Lahellec, Montreal.
Membre enregistré
86 messages
Popularité : +3 (3 votes)
Posté le 18 octobre 2017 - 21:04
Merci Michel Lahellec
J'ai joint sur le fichier de droite et cela fonctionne
Posté le 19 octobre 2017 - 13:13
Tant mieux.
On oublie souvent que la condition de jointure peut être autre chose qu'une simple égalité.

Michel Lahellec, Montréal
Membre enregistré
86 messages
Popularité : +3 (3 votes)
Posté le 19 octobre 2017 - 14:37
Une autre façon de faire :
Mettre la rubrique dans la "liste des éléments de votre requete" mais la déclarer "pas visible"