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

Développement SQL Server Discussion :

Select max, group by et having


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut Select max, group by et having
    Bonjour a tous,
    j'essaie d'effectuer une requête mais je bloque sur un détail. Je veux sélectionner le "peak_cps max" s’il y a sinon le "cps_max maximum"….Dans le cas du "peak_cps", je dois aussi inclure le "peak_depth" et dans le cas du "cps_max", je dois inclure le "dep_f" et le "dep_t" !!!
    Comment puis-je m’y prendre?

    exemple de données:
    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
     
     id    | NUMBER    | Dep_F  |  Dep_T |cps_max|cps_min|peak_cps|peak_depth
    1871   88-08-053     20.7	80	120	100		
    1872   88-08-053     80	280	110	90		
    1873   88-08-053     280	454	120	100		
    1874   88-08-053     454	575.5	130	110		
    1875   88-08-053     575.5	576.5	130	110	140	576
    1876   88-08-053     576.5	578.4	330	130	410	577
    1877   88-08-053     578.4	581.3	140	110	220	580.8
    1878   88-08-053     581.3	581.9	525	420	570	581.5
    1879   88-08-053     581.9	582.2	2770	1400	4875	582
    1880   88-08-053     582.2	582.4	23300	8000		
    1881   88-08-053     582.4	583.6	65000	65000		
    1882   88-08-053     583.6	583.8	25600	22200		
    1883   88-08-053     583.8	584.3	7000	1470	9900	584.1
    1884   88-08-053     584.3	585.6	450	110	2500	584.5
    et le résutalt souhaité:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    id    | NUMBER  |cps_max|peak_depth|Dep_F| Dep_T	 
    1881   88-08-053  65000		    582.4  583.6
    Voici ce que j'ai essayé qui se rapproche le plus de ce que je veux mais j'ai quelques aberrations

    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
     
    select 
    udef.number, 
    max(udef.peak_cps) as "Peak_CPS", 
    max(radiometrie1.peak_depth) as "Peak_Depth", 
    null as "dep_f", 
    null as "dep_t"
     
    from 
    udef
    join udef as radiometrie1 on udef.radiometrie_id = radiometrie1.radiometrie_id
     
    where 
    udef.peak_cps is not null and udef.peak_cps <> 0
    group by 
    udef.number
     
    union
     
    select 
    udef.number, 
    max(udef.cps_max) as "Peak_CPS", 
    null as "Peak_Depth",
    max(radiometrie1.dep_f) as "dep_f", 
    max(radiometrie1.dep_t) as "dep_t"
    from 
     
    udef 
    join udef as radiometrie1 on udef.radiometrie_id = radiometrie1.radiometrie_id
     
    group by 
    udef.number
     
     
    --having max(udef.peak_cps) is null or max(udef.peak_cps) = 0
    Merci !!

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Bonjour,

    L'explication n'est pas très claire, j'ai l'impression qu'elle ne colle pas vraiment avec votre exemple.
    En se basant sur l'exemple, pour récupérer la ligne qui a le plus grand cps_max par number :
    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
     
    SELECT u.id,
           u.number,
           u.Dep_F,
           u.Dep_T,
           u.cps_max,
           u.cps_min,
           u.peak_cps,
           u.peak_depth
    FROM udef u 
    JOIN 
    (
     SELECT number, max(cps_max) as cps_max
     FROM udef
     GROUP BY number
    ) umax ON u.number = umax.number AND u.cps_max = umax.cps_max
    N'hésitez pas à préciser les règles à appliquer.

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut
    Bonjour Snipah,
    en effet, c'étais pas très claire et je dois avouer que j'étais un peu confu dans la manière de résoudre mon problème!!! Néanmoins, tu viens de me donner une bonne piste quoi que j'ai de la difficulté à saisir les "umax" dans ta dernieres lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     umax ON u.number = umax.number AND u.cps_max = umax.cps_max
    J'ai donc maintenant une partie de la réponse....Cependant, je dois poussé davantage ma requête car si le "peak_cps" est supérieur au "cps_max", seulement le peak_cps doit être inclu dans le résultat:

    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
    15
    16
    17
     
     id    | NUMBER    | Dep_F  |  Dep_T |cps_max|cps_min|peak_cps|peak_depth
    1871   88-08-052    20.7	80	120	100		
    1872   88-08-052     80	280	110	90		
    1873   88-08-052     280	454	120	100		
    1874   88-08-052     454	575.5	130	110		
    1875   88-08-052     575.5	576.5	130	110	140	576
    1876   88-08-052     576.5	578.4	330	130	410	577
    1877   88-08-052     578.4	581.3	140	110	220	580.8
    1878   88-08-053     581.3	581.9	525	420	570	581.5
    1879   88-08-053     581.9	582.2	2770	1400	4875	582
    1880   88-08-053     582.2	582.4	23300	8000		
    1881   88-08-053     582.4	583.6	65000	65000		
    1882   88-08-053     583.6	583.8	25600	22200		
    1883   88-08-053     583.8	584.3	7000	1470	9900	584.1
    1884   88-08-053     584.3	585.6	450	110	2500	584.5
    idéalement, le résultat devrait être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     id    | NUMBER    | Dep_F  |  Dep_T |cps_max|peak_cps|peak_depth
    1876   88-08-052         		330	410	577
    1881   88-08-053     582.4	583.6	65000	
    Désolé d'avoir manqué un peu de précision au départ!!

    Merci beaucoup!

  4. #4
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut
    Bon j'y suis presque....J'essaie maintenant de sélectionner le maximum entre le "cps_max" et le "peak_cps" afin d'obtenir un seul résultat par "number"

    comment faire pour sélectionner le maximum entre deux champs différents dans les deux requêtes présente dans l'union??

    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
    SELECT  
    udef.number, 
    null as peak_cps, 
    null as peak_depth,
    udef.Dep_F, 
    udef.Dep_T,
    udef.cps_max
     
    from
    udef
     
     
    JOIN 
    (
     SELECT number, max(cps_max) AS cps_max
     FROM udef
     GROUP BY number
     
    ) umax ON udef.number = umax.number AND udef.cps_max = umax.cps_max
     
    union
     
    SELECT  
    udef.number, 
    udef.peak_cps, 
    udef.peak_depth,
    null as Dep_F, 
    null as Dep_T,
    null as cps_max
     
    from
    udef
     
     
    JOIN 
    (
     SELECT number, max(peak_cps) AS peak_cps
     FROM udef
     GROUP BY number
     
    ) umax ON udef.number = umax.number AND udef.peak_cps = umax.peak_cps

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    umax est un alias pour la sous-requête. Aliaser les tables et sous-requêtes est une bonne habitude à prendre
    Quel est votre SGBD?

  6. #6
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut
    ok merci de la précision, j'en prends bonne note!!!

    J'utilise SQLServer

Discussions similaires

  1. GROUP BY et HAVING MAX
    Par dragoon83 dans le forum Requêtes
    Réponses: 6
    Dernier message: 11/06/2014, 11h55
  2. Select max et GROUP BY
    Par mdimagho dans le forum Webi
    Réponses: 1
    Dernier message: 19/07/2013, 11h49
  3. Select all group having same value
    Par olibara dans le forum Langage SQL
    Réponses: 5
    Dernier message: 05/01/2012, 13h26
  4. Requête avec max(), group by et having. je m'y perds
    Par hispanus dans le forum SQLite
    Réponses: 3
    Dernier message: 11/02/2010, 15h29
  5. [8i]Select particulier GROUP BY/MAX
    Par kangaxx dans le forum SQL
    Réponses: 17
    Dernier message: 06/12/2007, 16h52

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