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 :

Champ temporaire à partir d'un autre champ


Sujet :

SQLite

  1. #1
    Membre du Club
    Homme Profil pro
    Sans
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 51
    Points
    51
    Par défaut Champ temporaire à partir d'un autre champ
    Bonjour
    j'ai une table OPERATIONS avec un champ DATE (de type text) qui contient des données comme '2017-08-24'
    je voudrais créer un champ temporaire NEWDAT dans une requête SQL qui par exemple ferait l'extraction de l'année et le mois '2017-08' par exemple
    ainsi je pourrai faire une requête style pour avoir les agrégats par année-mois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT NEWDAT,SUM(MONTANT) FROM OPERATIONS
    GROUP BY NEWDAT
    Est-ce possible ?

    Merci d'avance

    Cordialement

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 419
    Points : 1 096
    Points
    1 096
    Par défaut
    Bonjour,

    Comme ceci?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT substr(date, 1, 7) as NEWDAT,SUM(MONTANT) FROM OPERATIONS
    GROUP BY NEWDAT
    Cordialement

  3. #3
    Membre du Club
    Homme Profil pro
    Sans
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 51
    Points
    51
    Par défaut
    Bonjour @acaumes et merci pour le code :
    voila ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  substr(OPERATIONS.DATE, 1, 7) AS NEWDAT, OPERATIONS.CAT,OPERATIONS.RUB,SUM(OPERATIONS.MONTANT) AS 'Montant' FROM OPERATIONS
    WHERE(OPERATIONS.CAT='Transports' OR OPERATIONS.CAT ='Auto')
    AND (OPERATIONS.RUB ='Sncf' OR OPERATIONS.RUB='Péage' OR OPERATIONS.RUB='Carburant')
    AND OPERATIONS.DATE LIKE '2017%' 
    GROUP BY NEWDAT,OPERATIONS.CAT, OPERATIONS.RUB
    2017-06|Auto|Carburant|-94.04
    2017-06|Transports|Sncf|-57.3
    2017-07|Auto|Carburant|-89.83
    2017-07|Auto|Péage|-53.2
    2017-08|Auto|Carburant|-40
    2017-08|Auto|Péage|-31.4
    2017-08|Transports|Sncf|-181.7
    peut-on faire un sous-total sur NEWDAT ? et un total général ? si compliqué je ferai un autre billet.
    Bien cordialement

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    les Common Table Expression (CTE) et les UNION sont là pour ça

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    -- La CTE
    WITH C AS  ( SELECT  substr(DATE, 1, 7) AS NEWDAT, CAT,RUB,SUM(MONTANT) AS Montant FROM OPERATIONS
    WHERE(OPERATIONS.CAT='Transports' OR OPERATIONS.CAT ='Auto')
    AND (OPERATIONS.RUB ='Sncf' OR OPERATIONS.RUB='Péage' OR OPERATIONS.RUB='Carburant')
    AND OPERATIONS.DATE LIKE '2017%' 
    GROUP BY NEWDAT,OPERATIONS.CAT, OPERATIONS.RUB)
    -- L'exploitation de la CTE 
    SELECT NEWDAT FROM C
    UNION ALL
    SELECT NEWDAT,MAX('Total Mois'),MAX(''),SUM(montant) FROM C -- sous totaux par mois
    GROUP BY NEWDAT  
    UNION ALL
    SELECT MAX('TOTAL'),MAX('2017'),MAX(''),SUM(Montant) FROM C -- total général
    devrait donner quelque chose du genre
    2017-06|Auto|Carburant|-94.04
    2017-06|Transports|Sncf|-57.3
    2017-06|Total mois||-151.34
    2017-07|Auto|Carburant|-89.83
    2017-07|Auto|Péage|-53.2
    2017-07|Total mois||143.03
    2017-08|Auto|Carburant|-40
    2017-08|Auto|Péage|-31.4
    2017-08|Transports|Sncf|-181.7
    2017-08|Total mois||253.10
    TOTAL|2017|-547.47
    si je ne me suis pas trompé dans mes calculs
    P.S. fait sans test (la flemme de faire un jeu d'essai) et basé sur mon expérience SQL avec un SGBD différent (Firebird) par contre si Firebird fourni un résultat trié il n'est pas évident que SQLite le fasse mais convertir le SQL fournissant le résultat en une CTE et faire une interrogation de celle -ci pour ordonner l'ensemble donnera la solution

    P.P.S une CTE recursive est peut être envisageable mais il est un peu trop tôt pour mon cerveau sans caféine
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre du Club
    Homme Profil pro
    Sans
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 51
    Points
    51
    Par défaut
    Bonjour @SergioMaster

    Merci pour ton aide et ces explications, j'ai un peu adapté le code pour que ça me sorte quelque-chose car j'avais ce message :
    SELECTs to the left and right of UNION ALL do not have the same number of result columns: -- La CTE

    et tes calculs son justes

    Mais, en effet ce n'est pas trié avec SQLITE
    Nom : Capture du 2017-08-25 09-25-53.png
Affichages : 279
Taille : 23,1 Ko

    et refaire un CTE depuis un CTE je n'ai pas trop d'idée pour faire cela.. Les imbriquer ? ou remettre toutes les données dans une table en mémoire ?

    Bien cordialement

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Re,

    le résultat répond à mon interrogation "par contre si Firebird fourni un résultat trié il n'est pas évident que SQLite le fasse"
    SELECTs to the left and right of UNION ALL do not have the same number of result columns: -- La CTE
    je ne se sais pas où j'ai pu m....é une histoire de lignes avec les -- qui sont des commentaires peut être ?

    refaire un CTE depuis un CTE je n'ai pas trop d'idée pour faire cela.. Les imbriquer ?
    Oui, cela se fait facilement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH C AS  ( SELECT  substr(DATE, 1, 7) AS NEWDAT, CAT,RUB,SUM(MONTANT) AS Montant FROM OPERATIONS
    WHERE(OPERATIONS.CAT='Transports' OR OPERATIONS.CAT ='Auto')
    AND (OPERATIONS.RUB ='Sncf' OR OPERATIONS.RUB='Péage' OR OPERATIONS.RUB='Carburant')
    AND OPERATIONS.DATE LIKE '2017%' 
    GROUP BY NEWDAT,OPERATIONS.CAT, OPERATIONS.RUB),
    R AS  (SELECT NEWDAT FROM C
    UNION ALL
    SELECT NEWDAT,MAX('Total Mois'),MAX(''),SUM(montant) FROM C
    GROUP BY NEWDAT  
    UNION ALL
    SELECT MAX('TOTAL'),MAX('2017'),MAX(''),SUM(Montant) FROM C)
     
    SELECT * FROM R ORDER BY NEWDAT
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre du Club
    Homme Profil pro
    Sans
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 51
    Points
    51
    Par défaut
    Bonsoir

    Voila ça fonctionne

    les commentaires n'étaient pas en cause dans le message d'erreur. J'ai mis les colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    R AS  (SELECT NEWDAT,CAT, RUB, Montant FROM C
    il n'y a plus de problèmes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -- avec CTE
    WITH C AS  ( SELECT  substr(DATE, 1, 7) AS NEWDAT, CAT,RUB,SUM(MONTANT) AS MNT FROM OPERATIONS
    WHERE(CAT='Transports' OR CAT ='Auto')
    AND (RUB ='Sncf' OR RUB='Péage' OR RUB='Carburant')
    AND NEWDAT >= '2017-06'
    GROUP BY NEWDAT,CAT, RUB), 
    R AS  (SELECT NEWDAT,CAT, RUB, MNT FROM C -- repeter les champs
    UNION ALL
    SELECT NEWDAT,MAX('Total Mois'),MAX(''),SUM(MNT) FROM C -- par année / mois
    GROUP BY NEWDAT  
    UNION ALL
    SELECT MAX('TOTAL'),MAX('2017'),MAX(''),SUM(MNT) FROM C) -- sur l'année
    SELECT * FROM R ORDER BY NEWDAT
    Nom : sql.png
Affichages : 267
Taille : 24,4 Ko

    Voila merci encore de ton aide

    Bien cordialement

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

Discussions similaires

  1. [XL-MAC 2011] Champ calculé à partir d'un autre champ
    Par MrPchoun dans le forum Excel
    Réponses: 3
    Dernier message: 28/05/2015, 16h39
  2. Réponses: 2
    Dernier message: 15/11/2012, 14h57
  3. [ICEFACES] remplissage de champs a partir d un autre
    Par *alexandre* dans le forum JSF
    Réponses: 1
    Dernier message: 09/01/2009, 19h10
  4. remplir un champs à partir d'un autre champ
    Par Claire07 dans le forum Access
    Réponses: 4
    Dernier message: 19/06/2006, 13h50
  5. Création d'un champs à partir de 3 autres champs
    Par Badboy62cfp dans le forum Access
    Réponses: 2
    Dernier message: 23/05/2006, 16h47

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