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 :

Problème de SUM/GROUP BY


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Par défaut Problème de SUM/GROUP BY
    AVIS AUX EXPERT SQL !

    Cette requête ne me renvoi pas ttes les lignes ...

    Si je retire mon SUM la requête me renvoi bien toutes les lignes ...
    Si je mets dans mon " GROUP BY" ttes les critères, cela me renvoi toutes les lignes mais ne me calcule pas la somme.

    Je reste désemparé.
    Pourriez vous, s'il vous plaît, me guider ?

    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
    SELECT
      A.id_produit,
      A.id_fournisseur,
      A.ty_document,
      A.nu_document,
      A.qt_cmde_ini ,
      A.px_commande,
      A.ty_commande,
      (A.px_commande*A.qt_cmde_ini) AS Valorisation,
      A.id_user
     
    /* Calcul de la somme*/
    from(
    SELECT
     
      k.id_produit,
      k.id_fournisseur,
      k.dt_document,
      k.qt_cmde_ini,
      k.ty_commande,
      k.id_societe,
      k.id_offre,
      k.ty_document,
      k.nu_document,
      k.nucdli,
      k.id_user,
      k.dt_livraison,
      k.dt_confirmation,
      sum(k.px_commande) as px_commande /* Calcul de la somme*/
     
       from(
           SELECT /* SOUS REQUETE 2. Extraction des données agrégées par CDA*/
           z.id_produit,
           z.id_fournisseur,
           z.dt_document,
           z.qt_cmde_ini,
           z.ty_commande,
           z.id_societe,
           z.id_offre,
           z.id_user,
           z.dt_livraison,
           z.dt_confirmation,
           z.px_commande,
     
                              CASE z.cde_ter /*Dans le cas de cde ter*/
                       WHEN 0 THEN z.ty_document /* Si cde ter = 0 ( quand ty_document <> CDA alors  on récupère ty_document*/
                       ELSE 'CDA' /* Sinon on récupère CDA*/
                       END AS ty_document, /*Tout ceci est dans ty_document*/
     
                       CASE z.cde_ter
                       WHEN 1 THEN NULL /* Si ty_document = CDA * alors on récupère rien */
                       ELSE z.nucdli /*Sinon on récupère z.nucdli*/
                       END AS nucdli, /*tout ceci est dans nucdli, z.px_commande, z.cde_ter*/
                        z.cde_ter,
     
                       CASE z.cde_ter
                       WHEN 1 THEN z.nucdli /* Si ty_document = CDA alors on écrit rien z.nucdli */
                       ELSE z.nu_document /* Sinon on récupère nu_document */
                       END AS nu_document  /* Tout ceci est dans nu_document */
     
     
               FROM  (SELECT *,
    			   /* SOUS REQUETE 3. Agrégation des données dans le cas où nucdli = 				nu_commande */
                                    CASE
                                    WHEN EXISTS (SELECT 1 /* SOUS REQUETE 4. Extraction des données où nucdli = nu_commande  et ty_commande = CDA */
                                            FROM   tbl_ligneachat h
                                            WHERE  h.id_produit = q.id_produit
                                            AND q.nucdli = h.nu_document
                                            AND h.ty_document = 'CDA') /* FIN SOUS REQUETE 4 */
                                    THEN 1
                                    ELSE 0
                                    END AS cde_ter
     
                               FROM   tbl_ligneachat Q
               )AS z /* FIN SOUS REQUETE 3 */
     
       )AS k
     
    Group by
           k.id_produit,
           k.qt_cmde_ini,
           k.ty_commande,
           k.nu_document,
           k.nucdli,
           k.id_societe,
           k.id_offre
    )as A

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    La requête que vous avez postée ne correspond à aucun de vos choix :
    "Si je retire mon SUM la requête me renvoi bien toutes les lignes"
    "Si je mets dans mon " GROUP BY" ttes les critères, cela me renvoi toutes les lignes mais ne me calcule pas la somme"

    Sans rentrer dans les détails je l'écrirai de la façon suivante :
    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
    91
    92
    93
    SELECT
      A.id_produit,
      A.id_fournisseur,
      A.ty_document,
      A.nu_document,
      A.qt_cmde_ini ,
      A.px_commande,
      A.ty_commande,
      (A.px_commande*A.qt_cmde_ini) AS Valorisation,
      A.id_user
     
    /* Calcul de la somme*/
    FROM(
    SELECT
     
      k.id_produit,
      k.id_fournisseur,
      k.dt_document,
      k.qt_cmde_ini,
      k.ty_commande,
      k.id_societe,
      k.id_offre,
      k.ty_document,
      k.nu_document,
      k.nucdli,
      k.id_user,
      k.dt_livraison,
      k.dt_confirmation,
      sum(k.px_commande) AS px_commande /* Calcul de la somme*/
     
       FROM(
           SELECT /* SOUS REQUETE 2. Extraction des données agrégées par CDA*/
           z.id_produit,
           z.id_fournisseur,
           z.dt_document,
           z.qt_cmde_ini,
           z.ty_commande,
           z.id_societe,
           z.id_offre,
           z.id_user,
           z.dt_livraison,
           z.dt_confirmation,
           z.px_commande,
     
                              CASE z.cde_ter /*Dans le cas de cde ter*/
                       WHEN 0 THEN z.ty_document /* Si cde ter = 0 ( quand ty_document <> CDA alors  on récupère ty_document*/
                       ELSE 'CDA' /* Sinon on récupère CDA*/
                       END AS ty_document, /*Tout ceci est dans ty_document*/
     
                       CASE z.cde_ter
                       WHEN 1 THEN NULL /* Si ty_document = CDA * alors on récupère rien */
                       ELSE z.nucdli /*Sinon on récupère z.nucdli*/
                       END AS nucdli, /*tout ceci est dans nucdli, z.px_commande, z.cde_ter*/
                        z.cde_ter,
     
                       CASE z.cde_ter
                       WHEN 1 THEN z.nucdli /* Si ty_document = CDA alors on écrit rien z.nucdli */
                       ELSE z.nu_document /* Sinon on récupère nu_document */
                       END AS nu_document  /* Tout ceci est dans nu_document */
     
     
               FROM  (SELECT *,
    			   /* SOUS REQUETE 3. Agrégation des données dans le cas où nucdli = 				nu_commande */
                                    CASE
                                    WHEN EXISTS (SELECT 1 /* SOUS REQUETE 4. Extraction des données où nucdli = nu_commande  et ty_commande = CDA */
                                            FROM   tbl_ligneachat h
                                            WHERE  h.id_produit = q.id_produit
                                            AND q.nucdli = h.nu_document
                                            AND h.ty_document = 'CDA') /* FIN SOUS REQUETE 4 */
                                    THEN 1
                                    ELSE 0
                                    END AS cde_ter
     
                               FROM   tbl_ligneachat Q
               )AS z /* FIN SOUS REQUETE 3 */
     
       )AS k
     
    GROUP BY
      k.id_produit,
      k.id_fournisseur,
      k.dt_document,
      k.qt_cmde_ini,
      k.ty_commande,
      k.id_societe,
      k.id_offre,
      k.ty_document,
      k.nu_document,
      k.nucdli,
      k.id_user,
      k.dt_livraison,
      k.dt_confirmation
    )AS A

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Par défaut
    WAlDaR :

    Si je retire mon SUM la requête me renvoi bien toutes les lignes ...
    Si je mets dans mon " GROUP BY" ttes les critères, cela me renvoi toutes les lignes mais ne me calcule pas la somme
    Ceci n'est pas mon choix mais un constat

    Le GROUP BY que vous avez fait est logique :

    ___On groupe toujours par au moins tous les éléments de la sélection___

    Mais dans ce cas : cela ne me calcule pas correctement mon besoin qui est :

    • Addition des valeurs "px_commande" pour toutes les lignes de ma table qui ont : nucdli = nu_document.

    • On affiche la somme dans le px_commande de la ligne où se trouve le "nu_document" identique.

    • Et on ne retient plus la ligne où se trouve le "nucdli" lié.


    Ex :

    Ma table actuelle est

    id_prod | ty_document | nu_document | nucdli | px_commande

    A | CDA | 160 | |2
    A| CDD | 161 | 160 | 2
    A | CDA | 162 | | 2

    Je souhaite l' extraire tel que :

    A|CDA|160| |4
    A|CDA|162||2

    Mon premier résultat est l'addition entre la première et seconde ligne qui ont nucdli = nu_document.


    ---> RÉCAPITULONS:

    Dans un premier temps, cette requête regroupe les "nucdli"
    (n° commandes liées) et les "nu_document" ( n ° commande ) qui ont les mêmes identifiants ( 2 colonnes dans une même table qui ont les mêmes identifiants).

    Dans un second temps, elle est censée additionner les "px_commande" ( le coût des commandes) des regroupements ( au total, il y a 8 regroupement sur 40 664 lignes ).

    Étant donnée que ma requête fusionne les "nucdli" et les "nu_document" qui ont les mêmes identifiants, et qu'il y en a 8, la requête devrait me retourner 40 656 lignes.
    Or ma requête fait bien la somme et effectue bien la fusion mais ne me renvoi que 40 546 lignes soit une centaine en moins !


    Est ce plus clair ! ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui c'est plus clair.
    Dans le select et le group by, remplacez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      k.nu_document,
      k.nucdli,
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        coalesce(k.nucdli, k.nu_document) as nu_document
    Sans le as dans le group by.

    Dites-moi si ça fonctionne mieux.

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Par défaut
    Cette modification n'a malheureusement rien changé ...

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    J'ai supposé que le champ nucdli était null lorsqu'il n'y a rien de renseigné, mais ce n'est peut-être pas le cas.

    Y a-t'il un espace ou une chaîne vide ?

Discussions similaires

  1. problème opération sum date
    Par lazzeroni dans le forum Oracle
    Réponses: 1
    Dernier message: 19/06/2006, 12h03
  2. Problème avec le GROUP BY
    Par Golork dans le forum Langage SQL
    Réponses: 8
    Dernier message: 02/06/2006, 18h25
  3. [SQL Access] Problème avec Sum()
    Par badgam piero dans le forum Access
    Réponses: 5
    Dernier message: 12/12/2005, 16h00
  4. Problème requête avec group by et distinct
    Par tomca dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/07/2005, 16h10
  5. problème avec un GROUP BY
    Par Vermin dans le forum Requêtes
    Réponses: 4
    Dernier message: 30/03/2004, 14h44

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