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

SQLite Discussion :

Problème avec sqlite (c'est un problème de raisonnement)


Sujet :

SQLite

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Problème avec sqlite (c'est un problème de raisonnement)
    Bonjour à tous
    Voila c'est un problème de raisonnement, j'ai suite à une requête dans une table (dont je ne peux pas modifier le format)
    le résultat suivant
    Field_2 Field_5
    2024254 10,80
    2024254 11,30
    2024254 10,50
    2024254 10,70


    Field_2 étant le code utilisateur et Field_5 ses notes (Field_5 donnant toujours 4 résultats > moyenne annuel, trimestre 1, trimestre 2, trimestre 3)

    le tout à la suite pour environ 1300 élèves...
    je voudrais mettre le résultat de cette requête dans une autre table avec le format suivant
    Field_2 MoyAnnuel MoyTrim1 MoyTrim2 MoyTrim3
    2024254 10,80 11,30 10,50 10,70

    Avez vous une idée ?
    Cordialement,
    Olivier

  2. #2
    Membre actif

    Inscrit en
    Décembre 2004
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 169
    Points : 225
    Points
    225
    Par défaut
    C'est faisable.

    La première difficulté c'est de différencier tes moyennes par un code ou un moyen quelconque. Si tu n'as rien et que le résultat est toujours dans cet ordre : moyenne annuel, trimestre 1, trimestre 2, trimestre 3, on peut alors supposer que le rowid de la table sera toujours croissant pour ces quatre lignes.

    Si ce rowid commence avec 1 (modulo 4) alors on a gagné et rien n'est plus simple.
    En effet, dans ce cas, on aura (rowid%4) = 1 pour l'année, (rowid%4) = 2 pour le trimestre 2, ... (rowid%4) = 0 pour le dernier. Une vue permet d'avoir le résultat final (je suppose que la table initiale se nomme notes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create view result as select 
        field_2
      , sum(An) as MoyAnnuel
      , sum(T1) as MoyTrim1
      , sum(T2) as MoyTrim2
      , sum(T3) as MoyTrim3
    from (
    select field_2, Field_5 as An, 0 as T1, 0 as T2, 0 as T3 from notes where (rowid%4) = 1 union
    select field_2, 0 as An, Field_5 as T1, 0 as T2, 0 as T3 from notes where (rowid%4) = 2 union
    select field_2, 0 as An, 0 as T1, Field_5 as T2, 0 as T3 from notes where (rowid%4) = 3 union
    select field_2, 0 as An, 0 as T1, 0 as T2, Field_5 as T3 from notes where (rowid%4) = 0
    ) group by field_2 order by field_2;
    Voici un petit jeu test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    create table notes(field_2,field_5);
    insert into notes values (2024254, 10.80);
    insert into notes values (2024254, 11.30);
    insert into notes values (2024254, 10.50);
    insert into notes values (2024254, 10.70);
     
    insert into notes values (2024256, 17.30);
    insert into notes values (2024256, 18.20);
    insert into notes values (2024256, 17.30);
    insert into notes values (2024256, 17.50);
     
    insert into notes values (2024270, 9.50);
    insert into notes values (2024270, 10.10);
    insert into notes values (2024270, 9.40);
    insert into notes values (2024270, 9.30);
    Voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sqlite> .mod tabs
    sqlite>
    sqlite> select * from result;
    2024254 10.8    11.3    10.5    10.7
    2024256 17.3    18.2    17.3    17.5
    2024270 9.5     10.1    9.4     9.3
    sqlite>
    Bien sûr, si les données ne sont pas rangées de cette façon dans la table, il faut trouver une autre astuce afin de pouvoir discriminer chaque ligne.

    Mais, avant de poursuivre, est-ce que cela suffit ?
    ++

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Merci de m'avoir répondu
    Votre analyse de mon problème est la bonne et votre idée est excellente mais quand j'exécute le code j'ai :"SQLite Error 1 - no such column: Field_2."
    alors qu'elle existe (je suis repartis de votre exemple)... je sais pas trop...
    Cordialement,
    Olivier

  4. #4
    Membre actif

    Inscrit en
    Décembre 2004
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 169
    Points : 225
    Points
    225
    Par défaut
    Bonjour,

    Bon, on avance... je pense que ce n'est qu'une histoire de syntaxe.
    Le mieux est de faire des petits pas et de décomposer la solution afin de cerner l'erreur.

    Par exemple, il faut simplifier la vue et ne retenir qu'un seul élément pour faire quelques essais.
    - Ne sortir que 10 lignes des moyennes annuelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT field_2, Field_5 AS An, 0 AS T1, 0 AS T2, 0 AS T3 FROM notes WHERE (rowid%4) = 1 limit 10;
    - Faire une vue simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE VIEW simple AS SELECT 
        field_2
      , sum(An) AS MoyAnnuel
      , sum(T1) AS MoyTrim1
      , sum(T2) AS MoyTrim2
      , sum(T3) AS MoyTrim3
    FROM (
    SELECT field_2, Field_5 AS An, 0 AS T1, 0 AS T2, 0 AS T3 FROM notes WHERE (rowid%4) = 1 
    ) GROUP BY field_2;
    - Tester la vue simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sqlite> .mod tabs
    sqlite> SELECT * FROM simple limit 10;
    - etc.
    Bref, il faut cerner l'erreur de syntaxe, corriger et reconstruire pas à pas la requête finale.
    L'exemple fourni dans mon premier post est totalement indépendant et peut être testé seul. C'est d'ailleurs ce que j'ai fait mais en ligne de commande. Je ne connais pas le résultat si l'on passe par du code dans une application. Il arrive parfois que l'application (ex: ODBC) interprète le SQL avant de le passer à SQLite, d'où des erreurs difficiles à cerner.

    ++

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [Résolu] Un grand merci, tout fonctionne !
    Tout fonctionne à présent, je tenais à vous remercier pour le temps que vous avez passé pour me dépanner
    Cordialement,
    Olivier

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#]problème avec SqLite
    Par ClaudeBg dans le forum Linq
    Réponses: 8
    Dernier message: 18/06/2009, 16h17
  2. Problème avec SQLITE
    Par Jiyuu dans le forum Django
    Réponses: 2
    Dernier message: 12/03/2009, 07h07
  3. Quel est le problème avec ce programmateur ?
    Par mohfa2001 dans le forum Langage
    Réponses: 0
    Dernier message: 01/12/2008, 02h01
  4. [MySQL] OU est le probléme avec ce code ??
    Par adlich dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/04/2006, 17h47

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