Se connecter avec
S'enregistrer | Connectez-vous

ACCESS : Requête calcul SQL

Dernière réponse : dans Programmation

Bonjour,
Gros problème, petite question :
Je cherche à effectuer un calcul par le biais d'une requête (en SQL...), pour cela je fais appelle à une table mais le calcul est différent selon le type du champ...hum hum pour être plus clair, un exemple :
pour une année : z = a - Type "x" + Type "y"
comment faire appelle aux 2 types (2 enregistrments différents) ? (quelle est la "structure" du programme ?)
merci par avance pour votre potentielle aide :jap: 

Autres pages sur : access requete calcul sql

Lassé par la pub ? Créez un compte

ui d'accord, je manque de vocabulaire..alors un exemple, voici la structure de la table (et le remplissage) :

Id_Entité / Année / TypeEchange / Valeur Echange
14 2002 Import 54
14 2002 Export 110
14 2003 Import 16
14 2003 Export 100
etc.

et donc dans la requête le calcul recherché est, par année et par Entité, du genre :
z = a + (TypeEchange = "Import") - (TypeEchange = "Export")
voilà...le type c'est Import ou Export et je ne sais pas comment "faire appelle" à l'un ou l'autre...
Expert Programmation

Soluce simple à comprendre !

Récupère la somme des valeurs echangées en import :
SELECT Sum ( ValeurEchange )
FROM TaTable
WHERE TypeEchange = 'Import'


Récupère la somme des valeurs echangées en export :
SELECT Sum ( ValeurEchange )
FROM TaTable
WHERE TypeEchange = 'Export'


Fais la différence des deux et ajoute a, tu auras z.

Voici les tables :

Table COLL_Exp_Imp :
Id_Collectivite
Type_Interco (Import/Export)
Année
Volume

Table COLL_Distrib :
Id_Collectivite
Année
Volume_Distrib

Table COLL_Factur :
Id_Collectivite
Année
Volume_Factur

Le calcul souhaité via la requête (par année et par collectivite):
Rdt_Calcule = Volume_Factur / (Volume_Distrib - (Volume, Type_Interco = Export) + (Volume, Type_Interco = Import)

La requête sous forme SQL et qui ne "fonctionne" pas :
SELECT COLL_Factur.Id_Collectivite, COLL_Factur.Annee, First([COLL_Factur].[Volume_Factur]/([COLL_Distrib].[Volume_Distrib]-[COLL_Exp_Imp].[Export]+[COLL_Exp_Imp].[Import])) AS Rdt_Calcule
FROM ((((COLL_Distrib AS COLL_Distrib_1 INNER JOIN COLL_Factur AS COLL_Factur_1 ON COLL_Distrib_1.Id_Collectivite = COLL_Factur_1.Id_Collectivite) INNER JOIN Collectivites_AEP ON COLL_Distrib_1.Id_Collectivite = Collectivites_AEP.Id_Collectivite) INNER JOIN COLL_Distrib ON Collectivites_AEP.Id_Collectivite = COLL_Distrib.Id_Collectivite) INNER JOIN COLL_Exp_Imp ON Collectivites_AEP.Id_Collectivite = COLL_Exp_Imp.Id_Collectivite) INNER JOIN COLL_Factur ON Collectivites_AEP.Id_Collectivite = COLL_Factur.Id_Collectivite
GROUP BY COLL_Factur.Id_Collectivite, COLL_Factur.Annee, Collectivites_AEP.Interco_Nord
HAVING (((Collectivites_AEP.Interco_Nord)=No));

Voilà, je ne peux pas être plus précise (capacités limitées sur Access...), des idées ?
Expert Programmation

Mais, tu ne nous donne pas le type des colonnes :( 
Surtout Type_Interco.

C'est n'importe quoi ta requête :o  (Dit sans méchanceté)
Trop de INNER JOIN ! La preuve, COLL_Distrib et Collectivites_AEP sont liées deux fois ! Et ce First, à quoi sert-il ?

Dans ton deuxième message, tu parlais d'une table. En fait, il s'agissait du résultat d'une requête. Quelle requête ?

et oui je suis nulle :cry:  mais pleine de bonne volonté :ange: 
euh...le type des colonnes c'est

Table COLL_Exp_Imp :
Id_Collectivite : numérique
Type_Interco (Import/Export) : texte
Année : numérique
Volume : numérique

Table COLL_Distrib :
Id_Collectivite : numérique
Année : numérique
Volume_Distrib : numérique


Table COLL_Factur :
Id_Collectivite : numérique
Année : numérique
Volume_Factur : numérique

(j'ai bon là ?)

La table de mon deuxième message, on oublie, c'était un exemple pour pas à avoir à tout déballer (jumelle de la table COLL_Import_Export)...

Le first je ne sais pas à quoi il sert...en fait j'ai commencé la requête avec l'assistant et pouf, en SQL, le First était là.
La requête sert à calculer Rdt_Calcule...
help...
Expert Programmation

Essaie ça :
  1. SELECT Année, SommeImport.Somme - SommeExport.Somme
  2.  
  3. FROM ( SELECT SUM ( Volume ) Somme, Année
  4. FROM COLL_Exp_Imp
  5. WHERE Type_Interco = 'Import'
  6. GROUP BY Année ) AS SommeImport,
  7.  
  8. ( SELECT SUM ( Volume ) Somme, Année
  9. FROM COLL_Exp_Imp
  10. WHERE Type_Interco = 'Export'
  11. GROUP BY Année ) AS SommeExport
  12.  
  13. WHERE SommeImport.Année = SommeExport.Année


(Pas testé, je n'ai pas ACCESS. )

Bonjour et merci pour ton aide. Ta solution ne marchait pas sur Access, mais la suivante fonctionne bien :

  1. select cDistrib.Annee, CollAEP.Id_Collectivite, SUM(cFactur.Volume_Factur) / (SUM(cDistrib.Volume_Distrib) - SUM(cExport.Volume) + SUM(cImport.Volume)) as Rdt_Calcule
  2. from COLL_Factur cFactur,
  3. COLL_Exp_Imp cExport,
  4. COLL_Exp_Imp cImport,
  5. COLL_Distrib cDistrib,
  6. Collectivites_AEP CollAEP
  7. where
  8. CollAEP.Id_Collectivite = cDistrib.Id_Collectivite
  9. AND CollAEP.Id_Collectivite = cImport.Id_Collectivite
  10. AND CollAEP.Id_Collectivite = cExport.Id_Collectivite
  11. AND CollAEP.Id_Collectivite = cFactur.Id_Collectivite
  12. AND cImport.Type_Interco = 'Import'
  13. AND CExport.Type_Interco = 'Export'
  14. AND cDistrib.Annee = cImport.Année
  15. AND cDistrib.Annee = cExport.Année
  16. AND cDistrib.Annee = cFactur.Annee
  17.  
  18. Group by cDistrib.Annee, CollAEP.Id_Collectivite


Je pense que cela pourrait servir à d'autres...(merci encore !) :hello: 
Lassé par la pub ? Créez un compte