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 :

les plus petits et les plus grands


Sujet :

SQL Firebird

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut les plus petits et les plus grands
    Bonsoir,
    J'aimerais trouver les 5 plus petites villes et les 5 plus grandes villes dans une table contenant les villes (nom) et leur population (pop).
    J'imaginais faire une union entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT nom
    FROM villes
    GROUP BY pop ASC LIMIT 5
    et
    SELECT nom
    FROM villes
    GROUP BY pop DESC LIMIT 5
    mais ça ne marche pas.
    Auriez-vous une idée ?
    Merci

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 183
    Points : 41 383
    Points
    41 383
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    utiliser ORDER BY au lieu de GROUP BY

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut les plus petits et les plus grands
    Bonjour,
    Merci pour cette proposition mais Sqlite ne semble pas apprécier l'idée que ORDER BY comme GROUP BY soit placé avant UNION.
    Ca ne marche de ce fait pas.

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 183
    Points : 41 383
    Points
    41 383
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par lixe69 Voir le message
    Bonjour,
    Merci pour cette proposition mais Sqlite ne semble pas apprécier l'idée que ORDER BY comme GROUP BY soit placé avant UNION.
    Mais ici c'est le forum Firebird pas SQLite non nonobstant il y a toujours la possibilité d'une CTE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH VMAX AS (SELECT pop,nom FROM villes ORDER BY pop ASC LIMIT 5),
            VMIN  AS (SELECT pop,nom FROM villes ORDER BY pop DESC LIMIT 5)
    SELECT * FROM VMAX
    UNION
    SELECT * FROMVMIN

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2016
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Juste un grand merci d'où l'utilité des CTE.
    (Quand au bon forum, ma question était presque plus du SGB générale qu'autre chose)


    Citation Envoyé par SergioMaster Voir le message
    Mais ici c'est le forum Firebird pas SQLite non nonobstant il y a toujours la possibilité d'une CTE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH VMAX AS (SELECT pop,nom FROM villes ORDER BY pop ASC LIMIT 5),
            VMIN  AS (SELECT pop,nom FROM villes ORDER BY pop DESC LIMIT 5)
    SELECT * FROM VMAX
    UNION
    SELECT * FROMVMIN

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 469
    Points : 19 465
    Points
    19 465
    Par défaut
    Salut à tous.

    Quelque chose comme ça :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET ISO8859_1;
     
    -- =====================
    -- création table "test"
    -- =====================
     
    create table test (
    id       smallint  not null,
    ville    char(08)  not null collate fr_fr,
    habitant smallint  not null,
    constraint pk_test_id primary key (id)
    );
     
    insert into test (id,ville, habitant) values ( 1,'ville  1', 255);
    insert into test (id,ville, habitant) values ( 2,'ville  2', 163);
    insert into test (id,ville, habitant) values ( 3,'ville  3', 128);
    insert into test (id,ville, habitant) values ( 4,'ville  4', 240);
    insert into test (id,ville, habitant) values ( 5,'ville  5', 380);
    insert into test (id,ville, habitant) values ( 6,'ville  6', 655);
    insert into test (id,ville, habitant) values ( 7,'ville  7', 977);
    insert into test (id,ville, habitant) values ( 8,'ville  8', 238);
    insert into test (id,ville, habitant) values ( 9,'ville  9', 123);
    insert into test (id,ville, habitant) values (10,'ville 10', 654);
    insert into test (id,ville, habitant) values (11,'ville 11', 437);
    insert into test (id,ville, habitant) values (12,'ville 12', 984);
    insert into test (id,ville, habitant) values (13,'ville 13',  53);
    insert into test (id,ville, habitant) values (14,'ville 14', 222);
    insert into test (id,ville, habitant) values (15,'ville 15', 857);
    insert into test (id,ville, habitant) values (16,'ville 16', 517);
    insert into test (id,ville, habitant) values (17,'ville 17', 188);
    insert into test (id,ville, habitant) values (18,'ville 18', 629);
    insert into test (id,ville, habitant) values (19,'ville 19', 999);
    insert into test (id,ville, habitant) values (20,'ville 20', 364);
     
    select * from test;
     
         ID VILLE    HABITANT
    ======= ======== ========
          1 ville  1      255
          2 ville  2      163
          3 ville  3      128
          4 ville  4      240
          5 ville  5      380
          6 ville  6      655
          7 ville  7      977
          8 ville  8      238
          9 ville  9      123
         10 ville 10      654
         11 ville 11      437
         12 ville 12      984
         13 ville 13       53
         14 ville 14      222
         15 ville 15      857
         16 ville 16      517
         17 ville 17      188
         18 ville 18      629
         19 ville 19      999
         20 ville 20      364
     
     
    commit;
     
    -- ============
    -- Requête N° 1
    -- ============
     
    with temp as (
          select first 5 * from (select 'max' as tri, habitant, ville from test order by habitant desc)
    union select first 5 * from (select 'min' as tri, habitant, ville from test order by habitant asc )
    )
     
    select * from temp;
     
    TRI    HABITANT VILLE
    ====== ======== ========
    max         655 ville  6
    max         857 ville 15
    max         977 ville  7
    max         984 ville 12
    max         999 ville 19
    min          53 ville 13
    min         123 ville  9
    min         128 ville  3
    min         163 ville  2
    min         188 ville 17
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Il y a une chose qui me surprend, c'est qu'il ne conserve pas l'ordre de chaque sous-select.
    Je m'attendais à trouver pour la partie 'max', un ordre décroissant et pour la partie 'min'n un ordre croissant.

    @+

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 183
    Points : 41 383
    Points
    41 383
    Billets dans le blog
    63
    Par défaut
    Bonjour
    Citation Envoyé par Artemus24 Voir le message
    Il y a une chose qui me surprend, c'est qu'il ne conserve pas l'ordre de chaque sous-select.
    Je m'attendais à trouver pour la partie 'max', un ordre décroissant et pour la partie 'min'n un ordre croissant.
    c'est UNION qui tri selon l'ordre des champs indiqué pour avoir un tri qui corresponde à quelque chose, c'est dire ceci
    max 999 ville 19
    max 984 ville 12
    max 977 ville 7
    max 857 ville 15
    max 655 ville 6
    ...
    min 188 ville 17
    min 163 ville 2
    min 128 ville 3
    min 123 ville 9
    min 53 ville 13
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH VMAX AS (SELECT 1 AS ORDRE,HABITANT,VILLE FROM test ORDER BY HABITANT DESC ROWS 5),
         VMIN  AS (SELECT 2 AS ORDRE,HABITANT,VILLE FROM test ORDER BY HABITANT ASC ROWS 5),
         U AS ( SELECT * FROM VMAX
                UNION
                SELECT * FROM VMIN)
     
    SELECT CASE ORDRE WHEN 1 THEN 'max'
                      ELSE 'min'
           END,
           VILLE,
           HABITANT
    FROM U
    ORDER BY HABITANT DESC
    ou en simplifiant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with temp as (
          select first 5 * from (select 'max' as tri, habitant, ville from test order by habitant desc)
    union select first 5 * from (select 'min' as tri, habitant, ville from test order by habitant asc )
    )
     
    select tri,habitant,ville from temp order by habitant desc;
    c'est là où les CTE on vraiment un gros avantage !

    NB. au lecteur qui lirait ceci plus tard, au début pour selectionner les N premiers enregistrements nous avons utilisé LIMIT qui n'est pas un terme Firebird mais SQLite, l'équivalent de LIMIT avec Firebird est ROWS ou FIRST

    enfin un petit méaculpa dans les CTE que j'ai proposé précédemment, j'ai inversé les noms pour les villes VMAX il faut que l'ordre soit DESC et inversement VMIN => ordre ASC

    @lixe69 un petit ?

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 469
    Points : 19 465
    Points
    19 465
    Par défaut
    Salut SergioMaster.

    Merci pour ta précision !

    Citation Envoyé par SergioMaster
    c'est là où les CTE on vraiment un gros avantage !
    Oh que oui !

    Dommage que sous MySql, les CTE ainsi que les EXECUTE BLOCK n'existe pas. Cela serait très utile.

    @+

Discussions similaires

  1. Grosseur des icônes plus petite que les autres
    Par Mario Cayer dans le forum Android
    Réponses: 6
    Dernier message: 07/12/2014, 05h07
  2. Réponses: 2
    Dernier message: 07/03/2012, 17h53
  3. Réponses: 4
    Dernier message: 08/10/2010, 15h27
  4. Réponses: 3
    Dernier message: 16/12/2002, 16h12

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