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 :

Group by avec un intervalle


Sujet :

SQL Firebird

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Points : 144
    Points
    144
    Par défaut Group by avec un intervalle
    Bonjour,

    Est il possible de faire des group by en spécifiant un intervalle?

    Par exemple:

    Ref Angle
    T1 23
    T1 25
    T2 21
    T1 9
    T2 42
    T2 43

    Je voudrais grouper tous les 10° pour les angles en comptant le nombre d'evenements
    Ca donnerait
    T1 1=>une valeur de 0 à 10 pour T1
    T1 0
    T1 2=>2 valeurs entre 20 et 30 pour T1
    ...
    T2 0
    T2 0
    T2 1
    T2 0
    T2 2
    ...

    Ca me ferait un truc du genre select count(ref) from matable group by ref,"Angle tous les 10"

    Merci

  2. #2
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE TDATA(
      REF Char(2),
      ANGLE Smallint
    );
    tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH RECURSIVE R1 (INTERVMIN,INTERVMAX) AS (
    SELECT 0, 10  FROM RDB$DATABASE
    UNION ALL
    SELECT INTERVMIN+10,INTERVMAX+10 FROM R1
    WHERE INTERVMAX<360
    )
    SELECT TDATA.REF,COUNT(TDATA.REF),R1.INTERVMIN,R1.INTERVMAX FROM TDATA
    JOIN R1 ON ((TDATA.ANGLE>=R1.INTERVMIN AND TDATA.ANGLE<R1.INTERVMAX) OR (TDATA.ANGLE=360 AND R1.INTERVMAX=360)) 
    GROUP BY 1,3,4
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH RECURSIVE R1 (INTERVMIN,INTERVMAX) AS (
    SELECT 0, 10  FROM RDB$DATABASE
    UNION ALL
    SELECT INTERVMIN+10,INTERVMAX+10 FROM R1
    WHERE INTERVMAX<360
    )
    SELECT TDATA.REF,SUM(CASE WHEN ((TDATA.ANGLE>=R1.INTERVMIN AND TDATA.ANGLE<R1.INTERVMAX) OR (TDATA.ANGLE=360 AND R1.INTERVMAX=360)) THEN 1 ELSE 0 END),R1.INTERVMIN,R1.INTERVMAX FROM TDATA
    CROSS JOIN R1 
    GROUP BY 1,3,4
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Points : 144
    Points
    144
    Par défaut
    ENORME

    Merci beaucoup

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Points : 144
    Points
    144
    Par défaut
    J'ai 2 autres petites questions
    Est ce que la requete peut aussi me retourner le nombre total COUNT(TDATA.REF) pour pouvoir calculer le % d'occurence de chaque enregistrement?

    Je voudrais mettre cette requete dans une procédure stockée mais je ne sais pas comment faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 0, 10  FROM RDB$DATABASE
    UNION ALL
    SELECT INTERVMIN+10,INTERVMAX+10
    pour rendre le 10 paramétrable. J'ai essayé avec :param1 mais ca me donne une erreur

    Merci beaucoup

  5. #5
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Citation Envoyé par calou_33 Voir le message
    J'ai 2 autres petites questions
    Est ce que la requete peut aussi me retourner le nombre total COUNT(TDATA.REF) pour pouvoir calculer le % d'occurence de chaque enregistrement?
    comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH RECURSIVE R1 (INTERVMIN,INTERVMAX) AS (
    SELECT 0, 10  FROM RDB$DATABASE
    UNION ALL
    SELECT INTERVMIN+10,INTERVMAX+10 FROM R1
    WHERE INTERVMAX<360
    )
    SELECT TDATA.REF,
    SUM(CASE WHEN ((TDATA.ANGLE>=R1.INTERVMIN AND TDATA.ANGLE<R1.INTERVMAX) OR (TDATA.ANGLE=360 AND R1.INTERVMAX=360)) THEN 1 ELSE 0 END),
    SUM(1) TOTAL,
    R1.INTERVMIN,R1.INTERVMAX FROM TDATA
    CROSS JOIN R1
    GROUP BY 1,4,5
    Ceci dit, je ne vois pas bien l'interêt
    ou alors tu veux dire qq chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH RECURSIVE R1 (INTERVMIN,INTERVMAX) AS (
    SELECT 0, 10  FROM RDB$DATABASE
    UNION ALL
    SELECT INTERVMIN+10,INTERVMAX+10 FROM R1
    WHERE INTERVMAX<360
    )
    SELECT TDATA.REF,
    SUM(CASE WHEN ((TDATA.ANGLE>=R1.INTERVMIN AND TDATA.ANGLE<R1.INTERVMAX) OR (TDATA.ANGLE=360 AND R1.INTERVMAX=360)) THEN 1 ELSE 0 END),
    R1.INTERVMIN,R1.INTERVMAX FROM TDATA
    CROSS JOIN R1
    GROUP BY 1,3,4
    UNION SELECT 'Total',COUNT(*), 0, 360 FROM TDATA
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  6. #6
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Citation Envoyé par calou_33 Voir le message
    Je voudrais mettre cette requete dans une procédure stockée mais je ne sais pas comment faire
    dans ce cas là pas peine de passer par une requete recursive
    un classique curseur (FOR SELECT ....) fera l'affaire
    sinon, passer par un EXECUTE STATEMENT ou EXECUTE BLOCK
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 291
    Points : 144
    Points
    144
    Par défaut
    Merci encore

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

Discussions similaires

  1. [Oracle 9i] GROUP BY avec jointure.
    Par requinc dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/04/2006, 13h29
  2. [Struts]Select rempli avec un intervalle de nombre
    Par worldchampion57 dans le forum Struts 1
    Réponses: 1
    Dernier message: 13/04/2006, 11h21
  3. [Access] Clause GROUP BY avec une date
    Par Kanie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/04/2006, 20h58
  4. Groupe By avec jointure
    Par batoubat dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/12/2005, 15h12
  5. [Javascript] Afficher du texte avec des intervalles
    Par Invité4 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/01/2005, 22h29

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