IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête soustraction entre 2 requêtes ou Union ?


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Par défaut Requête soustraction entre 2 requêtes ou Union ?
    Bonjour,

    Il y a très très longtemps ... j'ai appris SQL, mais j'ai du apparemment oublier plein de choses en route !!! Aussi je me permet d'appeler au secours.

    Voila j'ai une table contenant :

    ID
    Nom d'utilisateur
    Total impression
    Date saisie

    Mon objectif est de faire un calcul visant à déterminer le nombre d'impression faite sur une période par un utilisateur. J'arrive a faire des requetes qui m'extraient les données à une date précise ou sur la plage de date voulue ; mais je n'arrive pas a écrire une seule requête qui me ferait la soustraction pour définir le nombre d'impression.

    Mes recherches m'ont amenées à explorer les voies de UNION et LEFT JOIN ; je pense que ce sont les bonnes solutions à utiliser mais a chaque fois j'obtiens une erreur de syntaxe dans la clause FROM ... Du coup, je n'arrive pas à faire une requête qui répondrait à mes besoins ou une qui fusionnerait celles que j'ai déjà faites et qui fonctionne.

    Je précise que je fais cela sous access, qu'il n'y a qu'une seule table. Maintenant mon SQL est loin peut être me proposerai vous une solution plus simple et/ou plus adapté ...

    Je vous en remercie pour votre patience, votre temps et vos réponses,

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Si la colonne Total_Impression est bien un compteur qui augmente de date en date, tu pourrais faire quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  Nom_Utilisateur
        ,   MAX(Total_Impression) - MIN(Total_Impression)   AS  Impression
    FROM    matable
    WHERE   Date_Saisie BETWEEN Debut_Periode And Fin_Periode
    GROUP BY Nom_Utilisateur
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Par défaut
    Bonsoir,

    Je me doutais que ce serait couillon .... mais à ce point là c'est moi le couillon (pour rester poli) ... Quelle simplicité !!!


    Encore mille merci ... Pour cette solution et le temps que vous m'avez consacré.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Lucky09 Voir le message
    Bonsoir,

    Je me doutais que ce serait couillon .... mais à ce point là c'est moi le couillon (pour rester poli) ... Quelle simplicité !!!


    Encore mille merci ... Pour cette solution et le temps que vous m'avez consacré.
    Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    date   user nimpressions
    d0      U1                10
    d0+3  U1                 15
    d0+6  U1                 25
    le select proprosé pour debut=d0+1 et fin = d0+5 retournera 0 et non 5 car min() et max() sur cette tranche valent tous les deux 15.


    Il faut d'abord transformer votre source en triples (user,date, delta) et ensuite faire le total des deltas sur l'intervalle de temps.
    Le delta s'obtient en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (total_impression  - lag(total_impression,1,0) over(partition by Nom_Utilisateur order by date_saisie)) as delta
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select Nom_Utilisateur, sum(delta) from (
       select Nom_Utilisateur, date_saisie, (total_impression  - lag(total_impression,1,0) over(partition by Nom_Utilisateur order by date_saisie)) as delta, date_saisie
          from data_source
    )
    where date_saisie between :start_date and :end_date
    group by Nom_Utilisateur;

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2017
    Messages : 5
    Par défaut Re
    Bonjour,

    Heureusement que je n'avais pas clos la discussion par ce que effectivement la première réponse, simple, fonctionne avec peu d'enregistrement. et je ne comprends d'ailleurs pas pourquoi la clause WHERE se met à dérailler avec un certain nombre d'enregistrement ...

    Comme je ne comprends pas cette commande lag ... J'ai testé avec les mêmes champs, la même requête et j'ai systématiquement "Erreur de syntaxe opérateur absent dans l'expression " (total_impression-lag(total_impression,1,0) over (partition by Nom_Utilisateur order by date_saisie)) as delta, date_saisie" pourtant votre syntaxe semble correcte d’après les manuel ... Ou alors il aussi une erreur dans le manuel ...

    Merci,

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Testé en 12c mais avec différents noms de champ... peut-être erreur de transcription ou différence due à la version...

    sinon LAG prend la valeur spécifiée (1er paramètre) dans un enregistrement précédent désigné par un offset (2ème paramètre) par rapport à l'enregistrement courant et s'il n'y pas d'enregistrement utilise la valeur par défaut (3ème param).
    (son pendant LEAD prend un enregistrement suivant)

    et le delta c'est bien le nombre d'impressions du record courant - (le nombre d'impressions du record précédent ou 0 si pas de précédent).

Discussions similaires

  1. UNION : critère de sélection entre 2 requêtes ?
    Par ctobini dans le forum Langage SQL
    Réponses: 5
    Dernier message: 29/09/2011, 11h05
  2. ACCESS 97, requête union, problème de liaison entre 2 requêtes
    Par AGR26 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 10/09/2007, 18h00
  3. Comment mettre les relations entre mes requêtes?
    Par cheickssy dans le forum Access
    Réponses: 2
    Dernier message: 22/03/2006, 17h42
  4. Résultats différent entre une requête SQL, et la même en VBA
    Par thetaps dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2005, 12h05
  5. [Technique] Conflits entre plusieurs requêtes
    Par Neowile dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 24/03/2003, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo