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

MS SQL Server Discussion :

problème requête SQL


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut problème requête SQL
    Bonjour à tous,

    Je voudrais faire une requête suivante :
    Afficher les 50 premiers clients selon le tableau suivant :
    [FONT=Arial] [/FONT][FONT=Arial]CA TOTAL[/FONT][FONT=Arial]MB TOTAL[/FONT][FONT=Arial]TX MB[/FONT][FONT=Arial]NB VOYAGES[/FONT][FONT=Arial]PANIER MOYEN[/FONT][FONT=Arial]CODE POSTAL[/FONT][FONT=Arial]CODE MAILING[/FONT][FONT=Arial]1 LIGNE PAR NOM CLIENT[/FONT][FONT=Arial] si typedossier <20 total=total+totalfacture[/FONT]
    [FONT=Arial]si typedossier>20[/FONT]
    [FONT=Arial]total=total-totalfacture[/FONT]
    [FONT=Arial]((CA FACT - PAIEMENT FRNS) / NB PAX PRODUIT)[/FONT][FONT=Arial]MB / CA [/FONT][FONT=Arial] [/FONT][FONT=Arial] [/FONT][FONT=Arial] [/FONT][FONT=Arial] [/FONT][FONT=Arial]TOTAL[/FONT][FONT=Arial] [/FONT][FONT=Arial] [/FONT][FONT=Arial]TOTAL[/FONT][FONT=Arial] [/FONT][FONT=Arial] [/FONT][FONT=Arial] [/FONT][FONT=Arial] [/FONT]
    NB PAX = si typedossier<20 total=total +([FONT=Arial]adultes+enfants) sinon si typedossier>20 [FONT=Verdana]total=total -([/FONT][FONT=Arial]adultes+enfants )[/FONT][/FONT]
    [FONT=Arial][/FONT]
    [FONT=Arial]voici la requete :[/FONT]
    select top 50 facture.seqclt,client.nomclt,sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end)as ca,
    sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end) -sum(facture.regle)as mb, case when sum(facture.total)<> 0
    then (sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end)- sum(facture.regle)) / sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end) else sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end) - sum(facture.regle)end as taux, count(client.seqclt) as nbvoyage, case when sum(facture.adultes + facture.enfants) <> 0 then sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end)/(sum(case when facture.typedossier < 20 then facture.adultes + facture.enfants else 0 end)- sum(case when facture.typedossier > 20 then facture.adultes + facture.enfants else 0 end)) end as panmoyen , client.codemail, client.cp
    from facture,vente,client where facture.seqvente = vente.seqvente and facture.seqclt = client.seqclt
    group by facture.seqclt, client.nomclt, client.codemail, client.cp
    order by ca desc
    je teste par case when sum(facture.adultes + facture.enfants) <> 0 pour ne pas avoir une division par zéro.
    je n'est pas réussi à trouver l'erreur "division par zéro", ce message est survenue lors de l'ajout de l'expression
    sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end)/(sum(case when facture.typedossier < 20 then facture.adultes + facture.enfants else 0 end)- sum(case when facture.typedossier > 20 then facture.adultes + facture.enfants else 0 end)) end as panmoyen
    dans le requête.

    Merci

  2. #2
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Ta question n'est pas lisible et vous avez peu de chance pour qu'on vous réponde.

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut problème requête
    Bonjour à tous,

    Je voudrais faire une requête suivante (tableau dans pièce jointe):
    Afficher les 50 premiers clients selon le tableau suivant :
    si typedossier < 20 on ajoute à la somme le total facture
    si typedossier > 20 on ajoute à la somme le total facture
    c'est idem pour NBPAX = adultes + enfants
    voici la requete :
    select top 50 facture.seqclt,client.nomclt,sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end)as ca,
    sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end) -sum(facture.regle)as mb, case when sum(facture.total)<> 0
    then (sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end)- sum(facture.regle)) / sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end) else sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end) - sum(facture.regle)end as taux, count(client.seqclt) as nbvoyage, case when sum(facture.adultes + facture.enfants) <> 0 then sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end)/(sum(case when facture.typedossier < 20 then facture.adultes + facture.enfants else 0 end)- sum(case when facture.typedossier > 20 then facture.adultes + facture.enfants else 0 end)) end as panmoyen , client.codemail, client.cp
    from facture,vente,client where facture.seqvente = vente.seqvente and facture.seqclt = client.seqclt
    group by facture.seqclt, client.nomclt, client.codemail, client.cp
    order by ca desc
    je teste par case when sum(facture.adultes + facture.enfants) <> 0 pour ne pas avoir une division par zéro.

    je n'est pas réussi à trouver l'erreur "division par zéro", ce message est survenue lors de l'ajout de l'expression
    sum(case when facture.typedossier < 20 then facture.total else 0 end)- sum(case when facture.typedossier > 20 then facture.total else 0 end)/(sum(case when facture.typedossier < 20 then facture.adultes + facture.enfants else 0 end)- sum(case when facture.typedossier > 20 then facture.adultes + facture.enfants else 0 end)) end as panmoyen
    dans le requête.

    Merci
    Fichiers attachés Fichiers attachés

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour, Non seulement ta question n'est pas lisible mais ton SQL non plus, ce qui peut t'empêcher de t'y retrouver et encore plus pour nous.
    Je suis allée sur le site sqlinform.com et voilà ta requête indentée, attention c'est juste cosmétique, il n'y a pas de modification, mais à part la lisibilité par un être humain.
    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    SELECT  top 50 facture.seqclt,
            client.nomclt,
            sum(
            CASE 
                    WHEN facture.typedossier < 20 
                    THEN facture.total 
                    ELSE 0 
            END
            )- sum(
            CASE 
                    WHEN facture.typedossier > 20 
                    THEN facture.total 
                    ELSE 0 
            END
            )as ca, 
            sum(
            CASE 
                    WHEN facture.typedossier < 20 
                    THEN facture.total 
                    ELSE 0 
            END
            )- sum(
            CASE 
                    WHEN facture.typedossier > 20 
                    THEN facture.total 
                    ELSE 0 
            END
            ) -sum(facture.regle)as mb, 
            CASE 
                    WHEN sum(facture.total)<> 0 
                    THEN (sum(
                    CASE 
                            WHEN facture.typedossier < 20 
                            THEN facture.total 
                            ELSE 0 
                    END
                    )- sum(
                    CASE 
                            WHEN facture.typedossier > 20 
                            THEN facture.total 
                            ELSE 0 
                    END
                    )- sum(facture.regle)) / sum(
                    CASE 
                            WHEN facture.typedossier < 20 
                            THEN facture.total 
                            ELSE 0 
                    END
                    )- sum(
                    CASE 
                            WHEN facture.typedossier > 20 
                            THEN facture.total 
                            ELSE 0 
                    END
                    ) 
                    ELSE sum(
                    CASE 
                            WHEN facture.typedossier < 20 
                            THEN facture.total 
                            ELSE 0 
                    END
                    )- sum(
                    CASE 
                            WHEN facture.typedossier > 20 
                            THEN facture.total 
                            ELSE 0 
                    END
                    ) - sum(facture.regle)
            END                  as taux, 
            count(client.seqclt) as nbvoyage, 
            CASE 
                    WHEN sum(facture.adultes + facture.enfants) <> 0 
                    THEN sum(
                    CASE 
                            WHEN facture.typedossier < 20 
                            THEN facture.total 
                            ELSE 0 
                    END
                    )- sum(
                    CASE 
                            WHEN facture.typedossier > 20 
                            THEN facture.total 
                            ELSE 0 
                    END
                    )/(sum(
                    CASE 
                            WHEN facture.typedossier < 20 
                            THEN facture.adultes + facture.enfants 
                            ELSE 0 
                    END
                    )- sum(
                    CASE 
                            WHEN facture.typedossier > 20 
                            THEN facture.adultes + facture.enfants 
                            ELSE 0 
                    END
                    )) 
            END as panmoyen , 
            client.codemail, 
            client.cp 
    FROM    facture,
            vente,
            client 
    WHERE   facture.seqvente   = vente.seqvente 
            and facture.seqclt = client.seqclt 
    GROUP BY facture.seqclt, 
            client.nomclt, 
            client.codemail, 
            client.cp 
    ORDER BY ca desc
    Qu'en penses-tu on ne s'y retrouve pas mieux??

    Je pense que le problème vient de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /(sum(
                    CASE 
                            WHEN facture.typedossier < 20 
                            THEN facture.adultes + facture.enfants 
                            ELSE 0 
                    END
                    )- sum(
                    CASE 
                            WHEN facture.typedossier > 20 
                            THEN facture.adultes + facture.enfants 
                            ELSE 0 
                    END)
    Le case when qui protège ta division par 0 ne prend en compte que
    sum(facture.adultes + facture.enfants)
    en non la soustraction.
    Pour simplifier ta requête tu aurais intérêt à utiliser
    -une sous requête qui calculerait les valeurs intermédiaires si facture.typedossier ....
    -Et le NULLIF, qui protège efficacement des divisions par 0. En effet une division par NULL ne génère pas une erreur. NullIF remplace une valeur déterminée par null
    Donc un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select C1/NullIF(C2,0) from toto
    Renverra null si C2=0


    Cordialement
    Soazig

Discussions similaires

  1. Problème requête SQL
    Par mandaillou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/10/2005, 11h37
  2. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  3. problème requête sql
    Par psychoBob dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2005, 17h50
  4. problème requête sql
    Par perfectdams dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2005, 18h09
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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