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

Langage SQL Discussion :

group by personnalisé.


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut group by personnalisé.
    bonjour, je me demandais s'il étais possible de faire un GROUP BY personnalisé

    je m'explique :

    j'ai dans un table des objects qui ont un status:


    "ouvert", "fermé","en cours","chez tota", "chez tata", "chez tutu"

    j'aimerais grouper par status, en regroupent tous ceux qui commencent par "chez ..."

    est-il possible de faire cela en une seule requête ? oubien dois-je utiliser un union ?

    merci.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Une clause GROUP BY ne sert que s'il y a un calcul d'agrégat avec SUM, COUT, MAX... si vous n'avez pas un tel calcul le GROUP BY ne sert à rien. Sans doute faites vous une confusion avec la tri ????

    Sinon, donnez un exemple concret en respectant les règles du forum.

    A +

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut
    évidament, j'utilise un AVG() dans le select.

    (je sait, avec le tri, il est possible de personaliser l'ordre.)

    je souhaite donc au final avoir un résultat du style :

    ouvert : 5
    fermé : 3
    encours : 8
    chez ... : 15

  4. #4
    Membre éprouvé
    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
    Points : 965
    Points
    965
    Par défaut
    Pouvez vous préciser votre SGBD et la structure de votre table? Ca pourrait faciliter la tache pour vous donner une piste.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut
    même si je ne voit pas en quoi ces informations sotn utiles, les voici quand même:

    le sgdb est le Microsoft SQL Server 2005 (la version complète, pas l'express)

    ensuite la structure est assez simple :

    id (varchar(12))
    name (varchar(64))
    status (varchar(32))
    nb_to_average (int)

  6. #6
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    Vous pouvez grouper sur un CASE, par exemple pour name:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY CASE WHEN left(name, 5) = 'chez ' THEN 'chez ' ELSE name end
    @+

  7. #7
    jnore
    Invité(e)
    Par défaut
    Bonsoir,

    essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    SELECT name, avg(nb_to_average )
    FROM TABLE
    WHERE name NOT LIKE 'chez%'
    GROUP BY name
     
    UNION
     
    SELECT SUBSTRING(name FROM 1 FOR 4), avg(nb_to_average )
    FROM TABLE
    WHERE name LIKE 'chez%'
    GROUP BY SUBSTRING (name FROM 1 FOR 4)

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    J'ai l'impression de rêver. Ou alors je suis de mauvais poil mais je m'en suis pas encore rendu compte.

    Dis voir, lepirlouit, t'es pas un peu agressif pour quelqu'un qui demande de l'aide ??
    Et si les gens te demandent des précisions, je te jure que ce n'est pas pour te faire chier...

    - Si SQL Pro, qui a l'habitude de résoudre des problèmes, n'a pas compris ce que t'as dit, c'est probablement parce que tes explications sont un peu justes et non pas parce qu'il serait incompétant

    - Quand on te demande le SGBD, c'est parce que selon, il peut y avoir des fonctionnalités différentes qui résolvent des problèmes bien spécifiques... est-ce qu'on peut supposer que si tu pose la question "est-ce qu'il est possible", ça veut dire que tu ne connais pas nécessairement tout sur tout ?

    - Et quant à la structure de la table... normalement c'est en DDL, c'est à dire l'instruction SQL qui a permis de la créer. En connaissant exactement la définition des données, on découvre souvent des loups. Oui. De plus, ça permet aux gens qui t'aident de tester plus facilement les solutions qu'ils te proposent (mais je suppose que tu dois nous considérer comme à ton service, non ?)

    Enfin bon, pour ce que j'en dis. Allez, mettez moi un avertissement parce que je suis méchant !

  9. #9
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour tout le monde,

    Parfois Pacmann, seul les règles suffisent


  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut
    Un tout grand merci à agemis31

    c'est exactement ce que je cherchais.
    on connais très peu le CASE en SQL
    voila, il faut pas oublier de rajouter dans le select exactement la mêem chose que dans le group by pour avoir l'effet souhaité



    ----------------
    Je comprend ta réaction Pacmann

    désolé d'avoir montré une pointe d'agressivité, ce n'étais pas mon but.

    la prochaine fois, j'essayerai de mettre des smileys pour que la chose soit mieux interprétée.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut
    je me permet de réouvrir le ticket.
    je pense plus à un bug de chez crosoft car quand j'execute la requête dans sql management studio ça fonctionne,
    par contre dans l'app ça foire.

    plus exactement :

    le group by fonctionne bien, par contre lorsque je veux l'intégrer dans le select, il me met un "Input string was not in a correct format."

    lorsque je change [THEN 'Sent to ...' ELSE p.text END]
    en [THEN 5 ELSE 3 END]

    la requête s'execute correctement, mais ne calcule plus les moyennes.
    exactement la même requête dans le manager studio me calcule quand même la moyenne.

    pourquoi veut-il vonvertir mon varchar en Int ?

    j'ai essayé des convert dans tous les sens, c'est pas mieux.
    toujours des erreurs, alors quand dans le studio manager, tout fonctionne.



    pour faire compliqué, voici ma requête complète:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select (CASE WHEN p.text LIKE 'Sent to%' THEN 'Sent to ...' ELSE p.text END),avg(datediff("dd",t.CreateDate,GETDATE())) FROM Ticket t, PickList p WHERE  t.StatusCode=p.itemid AND 1=1 AND (p.text LIKE 'Open' OR p.text LIKE 'In Process' OR p.text LIKE 'Pre-Closed' OR p.text LIKE 'Sent to%') GROUP BY CASE WHEN p.text LIKE 'Sent to%' THEN 'Sent to ...' ELSE p.text END

    le stacktrace ?
    ok, si vous voulez :
    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
     
    [FormatException: Input string was not in a correct format.]
       System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) +7469351
       System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) +119
       System.String.System.IConvertible.ToInt32(IFormatProvider provider) +46
       System.Convert.ToInt32(Object value) +28
       NHibernate.Type.Int32Type.Get(IDataReader rs, Int32 index) +82
     
    [FormatException: Input string 'Sent to ...' was not in the correct format.]
     
    ...
     
    [ADOException: could not execute query
    [ select (CASE WHEN p.text LIKE 'Sent to%' THEN 'Sent to ...' ELSE p.text END),avg(datediff("dd",t.CreateDate,GETDATE())) FROM Ticket t, PickList p WHERE  t.StatusCode=p.itemid AND 1=1 AND (p.text LIKE 'Open' OR p.text LIKE 'In Process' OR p.text LIKE 'Pre-Closed' OR p.text LIKE 'Sent to%') GROUP BY CASE WHEN p.text LIKE 'Sent to%' THEN 'Sent to ...' ELSE p.text END ]
    [SQL: select (CASE WHEN p.text LIKE 'Sent to%' THEN 'Sent to ...' ELSE p.text END),avg(datediff("dd",t.CreateDate,GETDATE())) FROM Ticket t, PickList p WHERE  t.StatusCode=p.itemid AND 1=1 AND (p.text LIKE 'Open' OR p.text LIKE 'In Process' OR p.text LIKE 'Pre-Closed' OR p.text LIKE 'Sent to%') GROUP BY CASE WHEN p.text LIKE 'Sent to%' THEN 'Sent to ...' ELSE p.text END]]

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Points : 32
    Points
    32
    Par défaut
    Hola ,

    3 heures de casse tête pour de simples ALIAS !


    oui, il suffisait de rajouter AS "Hello" dans le select

    et plus d'erreurs !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/11/2012, 10h50
  2. [WD-2010] Ruban personnalisé - traduction du nom de groupe
    Par Harry Covair dans le forum Word
    Réponses: 2
    Dernier message: 09/05/2011, 23h22
  3. [AC-2007] Recupérer le nom du groupe (onglet personnalisé)
    Par othke dans le forum VBA Access
    Réponses: 8
    Dernier message: 15/04/2010, 13h58
  4. Réponses: 2
    Dernier message: 25/07/2006, 09h41

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