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 :

Erreur d'agrégation dans code SQL


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Erreur d'agrégation dans code SQL
    Bonjour,
    j'essaie de faire un calcul par agrégation avec la formule suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sum(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal='902129000' then dbo.F_DOCLIGNE.DL_MontantHT + SUM (CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal='' 
      THEN dbo.F_DOCLIGNE.DL_MontantHT else 0 end)/sum(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal<>'' then dbo.F_DOCLIGNE.DL_MontantHT else 1 end)END) AS '902129000',
    et j'ai l'erreur suivante sous SQL-server:
    Impossible d'exécuter une fonction d'agrégation sur une expression comportant un agrégat ou une sous-requête.
    avez vous une idée?
    Cordialement et merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Si on décompose ton expression pour mettre en évidence les différents niveaux d'imbrication, on voit ceci :
    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
    SUM(    CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal = '902129000' 
                    THEN    dbo.F_DOCLIGNE.DL_MontantHT 
                        +   (   SUM(    CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal = '' 
                                                THEN dbo.F_DOCLIGNE.DL_MontantHT 
                                            ELSE 0 
                                        END
                                    )
                            /   SUM(    CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal <> '' 
                                                THEN dbo.F_DOCLIGNE.DL_MontantHT 
                                            ELSE 1 
                                        END
                                    )
                            )
            END
        ) AS '902129000'
    SQL Server refuse, avec raison, d'imbriquer une somme à l'intérieur d'une autre somme (et plus généralement un agrégat à l'intérieur d'un agrégat).
    La première question à te poser est donc : est-ce que, fonctionnellement, cette expression est bien celle que tu veux calculer ? Ou est-ce qu'à force d'essais/erreurs tu as oublié de déplacer une parenthèse ou équivalent ?
    Si réellement ce calcul est celui que tu veux effectuer, il va falloir décomposer ta requête en deux niveaux, un premier calculant SUM(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal = '' THEN dbo.F_DOCLIGNE.DL_MontantHT ELSE 0 END) / SUM(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal <> '' THEN dbo.F_DOCLIGNE.DL_MontantHT ELSE 1 END), le second utilisant le résultat de ce calcul.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Merci pour la réponse
    voici à la base mon code:
    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
    SELECT
      dbo.F_ARTICLE.AR_CodeFiscal AS 'CODE DOUANE',
      dbo.F_COMPTET.CT_Intitule AS INTITULE,
      dbo.F_COMPTET.CT_Identifiant AS INTRA,
      dbo.F_PAYS.PA_CodeIso2 AS PAYS,
      sum(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal<>'' then dbo.F_DOCLIGNE.DL_MontantHT else 0 end) AS MONTANT,
      sum(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal='' then dbo.F_DOCLIGNE.DL_MontantHT else 0 end) AS MP,
      sum (dbo.F_DOCLIGNE.DL_MontantHT) AS TOTALHT,
      sum(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal='902129000' then dbo.F_DOCLIGNE.DL_MontantHT else 0 end) AS '902129000',
      sum(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal='901849900' then dbo.F_DOCLIGNE.DL_MontantHT else 0 end) AS '901849900',
    sum(dbo.F_DOCLIGNE.DL_Qte*dbo.F_ARTICLE.AR_PoidsBrut/1000) AS POIDS,
      case 
     MONTH(dbo.F_DOCENTETE.DO_Date)
             WHEN 1 THEN 'Janvier'
             WHEN 2 THEN 'Février'
             WHEN 3 THEN 'Mars'
             WHEN 4 THEN 'Avril'
             WHEN 5 THEN 'Mai'
             WHEN 6 THEN 'Juin'
             WHEN 7 THEN 'Juillet'
             WHEN 8 THEN 'Août'
             WHEN 9 THEN 'Septembre'
             WHEN 10 THEN 'Octobre'
             WHEN 11 THEN 'Novembre'
             ELSE 'Décembre'
      end AS MOIS
    FROM
      dbo.F_DOCENTETE,
      dbo.F_ARTICLE,
      dbo.F_PAYS,
      dbo.F_COMPTET,
      dbo.F_DOCLIGNE
    WHERE
      ( dbo.F_DOCENTETE.DO_Piece=dbo.F_DOCLIGNE.DO_Piece  )
     AND   ( dbo.F_COMPTET.CT_Pays=dbo.F_PAYS.PA_Intitule  )
      AND  ( dbo.F_DOCLIGNE.AR_Ref=dbo.F_ARTICLE.AR_Ref  )
      AND  ( dbo.F_COMPTET.CT_Num=dbo.F_DOCLIGNE.CT_Num )
      -- AND  ( dbo.DP_ARTICLES.ART_UK=dbo.F_ARTICLE.ART_UK  )
      AND  (
      dbo.F_COMPTET.N_CatCompta  IN  ('3')
      AND  dbo.F_DOCENTETE.DO_Type  IN  ('6', '7')
      AND  (  dbo.F_DOCENTETE.DO_Date BETWEEN '01/05/2018' AND '31/05/2018' )
      )
    GROUP BY
      dbo.F_ARTICLE.AR_CodeFiscal,
      dbo.F_COMPTET.CT_Intitule, 
      case 
     MONTH(dbo.F_DOCENTETE.DO_Date)
             WHEN 1 THEN 'Janvier'
             WHEN 2 THEN 'Février'
             WHEN 3 THEN 'Mars'
             WHEN 4 THEN 'Avril'
             WHEN 5 THEN 'Mai'
             WHEN 6 THEN 'Juin'
             WHEN 7 THEN 'Juillet'
             WHEN 8 THEN 'Août'
             WHEN 9 THEN 'Septembre'
             WHEN 10 THEN 'Octobre'
             WHEN 11 THEN 'Novembre'
             ELSE 'Décembre'
      end
     
    , 
     dbo.F_COMPTET.CT_Identifiant,
      dbo.F_PAYS.PA_CodeIso2
    J'essaie de répartir au prorata des valeurs de 902129000 et de 901849900 ma valeur MP par rapport à MONTANT.
    J'ai essayé en déclarant des variables locales mais je n'arrive pas à mon résultat.
    Je suis dans l'impasse.
    Merci encore

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Bonjour,
    J'ai continué à faire évoluer le programme et je n'ai plus d'erreur et je calcule bien au prorata des valeurs de @MP et @MONTANT chaque champ par contre je n'arrive pas à répartir correctement les valeurs exemple pour le CODE INTRA RO14114447 j'ai 20€ de port et 128€ de marchandises je voudrais avoir donc 148€ au total pour le code intra 902129000 et non pas la répartition du calcul global.
    Voici le nouveau code:
    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
    declare @MONTANT decimal(8,2), @MP decimal(8,2);
    SELECT
    @MONTANT=sum(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal<>'' then dbo.F_DOCLIGNE.DL_MontantHT else 0 end) ,
      @MP=sum(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal='' then dbo.F_DOCLIGNE.DL_MontantHT else 0 end) 
    FROM
      dbo.F_DOCENTETE,
      dbo.F_ARTICLE,
      dbo.F_PAYS,
      dbo.F_COMPTET,
      dbo.F_DOCLIGNE
    WHERE
      ( dbo.F_DOCENTETE.DO_Piece=dbo.F_DOCLIGNE.DO_Piece  )
     AND   ( dbo.F_COMPTET.CT_Pays=dbo.F_PAYS.PA_Intitule  )
      AND  ( dbo.F_DOCLIGNE.AR_Ref=dbo.F_ARTICLE.AR_Ref  )
      AND  ( dbo.F_COMPTET.CT_Num=dbo.F_DOCLIGNE.CT_Num )
      -- AND  ( dbo.DP_ARTICLES.ART_UK=dbo.F_ARTICLE.ART_UK  )
      AND  (
      dbo.F_COMPTET.N_CatCompta  IN  ('3')
      AND  dbo.F_DOCENTETE.DO_Type  IN  ('6', '7')
      AND  (  dbo.F_DOCENTETE.DO_Date BETWEEN '01/05/2018' AND '31/05/2018' )
      )
     
      Select
      dbo.F_ARTICLE.AR_CodeFiscal AS 'CODE DOUANE',
      dbo.F_COMPTET.CT_Intitule AS INTITULE,
      dbo.F_COMPTET.CT_Identifiant AS INTRA,
      dbo.F_PAYS.PA_CodeIso2 AS PAYS,
     
    sum (dbo.F_DOCLIGNE.DL_MontantHT) AS TOTALHT,
     
      sum(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal='902129000' then dbo.F_DOCLIGNE.DL_MontantHT+(dbo.F_DOCLIGNE.DL_MontantHT*@MP/@MONTANT) else 0 end) AS '902129000',
      sum(CASE WHEN dbo.F_ARTICLE.AR_CodeFiscal='901849900' then dbo.F_DOCLIGNE.DL_MontantHT+(dbo.F_DOCLIGNE.DL_MontantHT*@MP/@MONTANT) else 0 end) AS '901849900',
    sum(dbo.F_DOCLIGNE.DL_Qte*dbo.F_ARTICLE.AR_PoidsBrut/1000) AS POIDS,
      case 
     MONTH(dbo.F_DOCENTETE.DO_Date)
             WHEN 1 THEN 'Janvier'
             WHEN 2 THEN 'Février'
             WHEN 3 THEN 'Mars'
             WHEN 4 THEN 'Avril'
             WHEN 5 THEN 'Mai'
             WHEN 6 THEN 'Juin'
             WHEN 7 THEN 'Juillet'
             WHEN 8 THEN 'Août'
             WHEN 9 THEN 'Septembre'
             WHEN 10 THEN 'Octobre'
             WHEN 11 THEN 'Novembre'
             ELSE 'Décembre'
      end AS MOIS
    FROM
      dbo.F_DOCENTETE,
      dbo.F_ARTICLE,
      dbo.F_PAYS,
      dbo.F_COMPTET,
      dbo.F_DOCLIGNE
    WHERE
      ( dbo.F_DOCENTETE.DO_Piece=dbo.F_DOCLIGNE.DO_Piece  )
     AND   ( dbo.F_COMPTET.CT_Pays=dbo.F_PAYS.PA_Intitule  )
      AND  ( dbo.F_DOCLIGNE.AR_Ref=dbo.F_ARTICLE.AR_Ref  )
      AND  ( dbo.F_COMPTET.CT_Num=dbo.F_DOCLIGNE.CT_Num )
      -- AND  ( dbo.DP_ARTICLES.ART_UK=dbo.F_ARTICLE.ART_UK  )
      AND  (
      dbo.F_COMPTET.N_CatCompta  IN  ('3')
      AND  dbo.F_DOCENTETE.DO_Type  IN  ('6', '7')
      AND  (  dbo.F_DOCENTETE.DO_Date BETWEEN '01/05/2018' AND '31/05/2018' )
      )
    GROUP BY
      dbo.F_ARTICLE.AR_CodeFiscal,
      dbo.F_COMPTET.CT_Intitule, 
      case 
     MONTH(dbo.F_DOCENTETE.DO_Date)
             WHEN 1 THEN 'Janvier'
             WHEN 2 THEN 'Février'
             WHEN 3 THEN 'Mars'
             WHEN 4 THEN 'Avril'
             WHEN 5 THEN 'Mai'
             WHEN 6 THEN 'Juin'
             WHEN 7 THEN 'Juillet'
             WHEN 8 THEN 'Août'
             WHEN 9 THEN 'Septembre'
             WHEN 10 THEN 'Octobre'
             WHEN 11 THEN 'Novembre'
             ELSE 'Décembre'
      end
     
    , 
     dbo.F_COMPTET.CT_Identifiant,
      dbo.F_PAYS.PA_CodeIso2
    Merci encore pour votre aide

  5. #5
    Membre habitué Avatar de i.chafai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Décembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 117
    Points : 167
    Points
    167
    Par défaut
    Je pense que tu es partis des views de l'édition piloté de Sage. J'ai rencontré de gros problèmes de performances avec (absence de jointure, udf au lieu de jointure...)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Bonjour
    Non je n'utilise plus les éditions pilotées car comme toi j'ai eu trop de surprises et d'énormes lenteurs je développe directement sous Excel ou Msquery afin de pouvoir me generer mes cubes de travail
    Pour ce qui est de mon problème je vais tenter un inner join dans ma requête et je vais voir
    Merci encore

  7. #7
    Membre habitué Avatar de i.chafai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Décembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 117
    Points : 167
    Points
    167
    Par défaut
    Attention a La jointure entre f_docligne et f_docentete (manque celle avec DO_Type), un même Numéro de document peut etre attribuer a des types de documents différents (meme numero pour le même domaine avec un type différent ou meme sur un autre domaine)
    J'ai eu presque le même besoin chez l'un de mes clients, j'ai créé des infolibres sur les lignes et je fais le calcul avec un trigger after update sur la F_Docligne (malheureusement, on tombe sur un disfonctionnement de Sage si on crée des colonnes calculés dans la structure de table)

  8. #8
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Octobre 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Bonne remarque sur le DO_Type j'avais oublié merci.
    On a multiplié les triggers pour des recalculs divers et variés et on ralentit quand même pas mal le système.
    C'est pour ça que je cherche pour ce type d'opération, entre autre, à le réaliser en externe à la demande sur Excel directement.
    Je pense que je vais me résoudre à une extraction basique sous EXCEL et un VBA attaché afin de générer correctement mon CERFA si je n'arrive pas à finaliser la requête.
    Je continue.
    merci encore.

Discussions similaires

  1. [AC-2003] Erreur incompatibilité de type : code SQL dans une fonction VBA
    Par KonTiKI dans le forum VBA Access
    Réponses: 5
    Dernier message: 18/04/2016, 17h15
  2. pb d'espaces dans code SQL ex table Access
    Par lbar012001 dans le forum VBA Access
    Réponses: 2
    Dernier message: 06/01/2010, 16h24
  3. [MySQL] Variable php dans code sql pour désigner le nom du champ
    Par prophen dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/05/2008, 13h46
  4. Erreur d'agrégation dans une requête UNION
    Par soso78 dans le forum Access
    Réponses: 2
    Dernier message: 05/10/2005, 00h11
  5. [Servlet][Compilation] Erreur de compil dans code servlet
    Par gandalf_le_blanc dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/05/2004, 10h17

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