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

SQL Firebird Discussion :

Regroupement par mois


Sujet :

SQL Firebird

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut Regroupement par mois
    Bonjour,
    J'utilise Interbase 6 et Delphi 5 avec le BDE.
    Je voudrais fairee quelque chose du style:
    SELECT
    sum(REGLEMENT.MONTANT_REGLEMENT) as total
    FROM
    REGLEMENT
    group by
    EXTRACT(MONTH from REGLEMENT.DATE_REGLEMENT) + EXTRACT(YEAR from REGLEMENT.DATE_REGLEMENT)

    Evidemment ça ne marche pas. Mais auriez vous une idée pour faire ça ?

    fp

  2. #2
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 44
    Points : 49
    Points
    49
    Par défaut
    je ne sais pas si c'est la meilleure idée, mais tu peux passer par une vue, qui contient ta table + une collonne correspondant au mois ... et ainsi ta requete se fait avec un group by sur cette collonne

  3. #3
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut Re: Regroupement par mois
    Tu as plusieurs solutions dont une qui consisterai à créer une vue basée sur ta table REGLEMENT mais qui y ajouterai une colonne calculée du type : substr(CAST(DATE_REGLEMENT as char(10)),1,7) (ou mieux deux colonnes : substr(CAST(DATE_REGLEMENT as char(10)),1,4) et substr(CAST(DATE_REGLEMENT as char(10)),6,7) )

    et à partir de cette vue tu pourra faire les regroupements que tu désires.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut SUBSTR ?
    Bonjour,
    Je croyais que vous m'aviez sauvé mais mon Interbase ne reconnait pas l'instruction SUBSTR. J'ai essayé :
    select
    substr(CAST(reglement.DATE_REGLEMENT as char(10)),1,4)
    from reglement

    pour voir et je reçois: "An error was found in the application program input parameters for the SQL statement.
    Dynamic SQL Error.
    SQL error code = -804.
    Function unknown.
    SUBSTR."
    Je teste avec EMS Quickdesk.

    Sinon j'ai découvert l'utilisation de EXTRACT sur le site:
    http://sqlpro.developpez.com/SQL_AZ_2.html
    car l'aide d'Interbase n'en parle pas (ou je n'ai pas su chercher).

    Et il y aurait la solution de construire sous Delphi une requête dynamique avec 12 unions:
    SELECT
    sum(REGLEMENT.MONTANT_REGLEMENT) as total
    FROM
    REGLEMENT
    where EXTRACT(MONTH from REGLEMENT.DATE_REGLEMENT) = 1
    and EXTRACT(YEAR from REGLEMENT.DATE_REGLEMENT) = 2003
    union
    SELECT
    sum(REGLEMENT.MONTANT_REGLEMENT) as total
    FROM
    REGLEMENT
    where EXTRACT(MONTH from REGLEMENT.DATE_REGLEMENT) = 2
    and EXTRACT(YEAR from REGLEMENT.DATE_REGLEMENT) = 2003
    ...

    Mais bof...

    J'aurais effectivement préféré passer par une vue.
    Quelles sont les conditions pour que SBSTR fonctionne ?

    @+
    fp

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut A Y EST !
    Ca ça fait ma vue:
    SELECT reglement.date_reglement,
    REGLEMENT.MONTANT_REGLEMENT,
    cast(extract(YEAR from REGLEMENT.DATE_REGLEMENT) as char(4)) as ANNEE,
    CAST(EXTRACT(MONTH from REGLEMENT.DATE_REGLEMENT) as char(2)) as MOIS

    FROM
    REGLEMENT

    Y a pu qu'à.

    Merci.
    fp

  6. #6
    Membre du Club
    Inscrit en
    Mars 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 44
    Points : 49
    Points
    49
    Par défaut
    soit tu crées une UDF substring ( enfin , 'créer' : tu cherches un peu sur le net pour avoir la fonction , puis tu la déclare dans ta base ..)
    soit, faut essayer , tu regardes si EXtract + vue ça marcherais pas ( 1 colonne recevant le mois, une colonne recevant l'année)

    EDIT : ben voila tu a réussi tout seul ... y'a plus qu'a mettre le sujet comme [RESOLU] (avec la nouvelle méthode : lorsque tu lis les messages, tu as un bouton qui te le permet)

  7. #7
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Substring est fourni avec interbase 6 dans l'UDF ib_udf.dll.

    Il suffit juste de déclarer son utilisation dans la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE EXTERNAL FUNCTION SUBSTR
        CSTRING(256),
        INTEGER,
        INTEGER
    RETURNS CSTRING(256)
    ENTRY_POINT 'fn_substr' MODULE_NAME 'rfunc'
    sinon oui extract est mieux

    par contre tu n'es pas obligé de caster en char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT reglement.date_reglement, 
    REGLEMENT.MONTANT_REGLEMENT, 
    extract(YEAR from REGLEMENT.DATE_REGLEMENT) as ANNEE, 
    EXTRACT(MONTH from REGLEMENT.DATE_REGLEMENT) as MOIS 
    FROM 
    REGLEMENT

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut Merci
    Même si aujourd'hui je vais m'en sortir avec Extract, plus d'une fois j'ai souhaité découper des chaînes dans les requêtes. Donc je garde !
    @+
    Merci
    fp

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

Discussions similaires

  1. Regrouper par mois glissants ?
    Par youpitralala dans le forum Requêtes
    Réponses: 16
    Dernier message: 03/04/2008, 16h02
  2. créer une requête pour regrouper par mois
    Par kuhnden dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 26/01/2008, 13h41
  3. Regroupement par mois dans un état
    Par laurence1002 dans le forum IHM
    Réponses: 12
    Dernier message: 04/02/2007, 21h20
  4. Etat avec regroupement par mois
    Par auriolbeach dans le forum IHM
    Réponses: 2
    Dernier message: 17/07/2006, 03h24
  5. [Requête] Regroupement par mois en cours
    Par Burnout dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/01/2006, 09h36

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