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 :

Requête sql having


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Comptabilité
    Inscrit en
    Novembre 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Comptabilité

    Informations forums :
    Inscription : Novembre 2014
    Messages : 63
    Points : 26
    Points
    26
    Par défaut Requête sql having
    Bonjour,

    Je suis un petit peu novice sur le SQL...
    Mais je souhaiterai avoir le résultat entre deux colonnes et que le résultat soit compris entre x et x.

    Exemple

    Colonne A Colonne B Colonne C [Colonne D (Différence entre B - C)]
    Pierre_______5_________2_________3
    Paul_______ 9_________3_________6
    Jack_______-8_________-7________-1

    Et donc afficher les lignes comprise entre 3 et -3 résultat de la colonne B - celle de C, ce qui donne :

    Colonne A Colonne B Colonne C
    Pierre_______5_________2_________3
    Jack_______-8_________-7________-1


    Je ne sais pas si je suis bien clair , normalement avec le méthode "having" c'est possible mais entre deux colonnes je ne trouve pas comment faire.

    Merci par avance Cdt.

  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 762
    Points
    30 762
    Par défaut
    Quelle est le mode de calcul de la colonne D ? Je n'arrive pas à comprendre à partir de l'exmple donné.
    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
    Nouveau membre du Club
    Homme Profil pro
    Comptabilité
    Inscrit en
    Novembre 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Comptabilité

    Informations forums :
    Inscription : Novembre 2014
    Messages : 63
    Points : 26
    Points
    26
    Par défaut requete sql having
    Pardon je viens de modifier ma demande.

  4. #4
    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 762
    Points
    30 762
    Par défaut
    Avec des valeurs cohérentes, c'est beaucoup plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select  a, b, c
    from    matable
    where   c - b between -3 and 3
    ;
    PS : HAVING n'est à utiliser qu'avec des fonctions de regroupement.
    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.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Comptabilité
    Inscrit en
    Novembre 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Comptabilité

    Informations forums :
    Inscription : Novembre 2014
    Messages : 63
    Points : 26
    Points
    26
    Par défaut requete sql having
    Nom : Photo pleine page.png
Affichages : 276
Taille : 142,3 Ko

    En faite je me suis peut être mal exprimé je voudrais faire apparaître la différence entre le [montant] - et le [facturé] comprise entre -1000 et 1000 par exemple.
    Soit que les dossiers --> 1682, 904.

    Pour information la colonne différence ne fait pas partie de le requête et j'ai également un GROUP BY.

    Je suis désolé si je ne suis pas trop clair...

  6. #6
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 119
    Points : 83 898
    Points
    83 898
    Billets dans le blog
    15
    Par défaut


    Il fallait juste adapter la requête proposée par al1_24 à ta situation.

    Soit la Table1 : la table contenant les données.

    Cette requête devrait te permettre d'avoir le résultat attendu :

    [CODE]
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Table1.Dossier, Table1.Validation, [Table1.Facture]-[Table1.Montant] as Diff
    FROM Table1
    WHERE [Table1.Facture]-[Table1.Montant] between -1000 AND 1000;
    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Comptabilité
    Inscrit en
    Novembre 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Comptabilité

    Informations forums :
    Inscription : Novembre 2014
    Messages : 63
    Points : 26
    Points
    26
    Par défaut requete sql having
    Bonjour,

    Je joins ma requête pour l'avoir la plus complète possible.

    Cela pourrais fonctionné mais ça me double toutes mets lignes, et ça m'additionne les montants négatif entre eux au lieu de les soustraire (exemple Montant -5 facturé -4 diff = -9 à la place de -1) Car la colonne facturé peux être des avoirs.
    J'ai rajouté dans ma requete : dans SELECT : ((PrjMonFacture) - (leproduit.IteMon2)) as Diff, et dans le GROUP BY leproduit.IteMon2, et aussi dans le WHERE And (PrjMonFacture) - (leproduit.IteMon2) not between -1000 AND 1000.

    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
    SELECT
    DosStrCompta As Ccompta,
    DosLngId As Dossier,
    DosStrNom As Nom_Client,
    PrjLngId As Projet,
    PrjStrLibelle As Nom_Projet,
    PrjDat2 As Validation,
    PrjMonFacture As Facturé,
    ((PrjMonFacture) - (leproduit.IteMon2)) as Diff,
     
    --MontantHTRemise
        Sum(case when sousRemise.IteLngId is not null and remise.IteLngId is not null then
        -- sous remise + remise //
                    ((Cast( cast( leproduit.IteLng2 as float)/100 as decimal (10,2))*leproduit.IteMon2) - ((Cast( cast( leproduit.IteLng2 as float)/100 as decimal (10,2))*leproduit.IteMon2) * (sousRemise.IteMon2/100))) - (((Cast( cast( leproduit.IteLng2 as float)/100 as decimal (10,2))*leproduit.IteMon2) - ((Cast( cast( leproduit.IteLng2 as float)/100 as decimal (10,2))*leproduit.IteMon2) * (Cast( cast( sousRemise.IteMon2 as float)/100 as decimal (10,5))))) * (Cast( cast( remise.IteMon2 as float)/100 as decimal (10,5))))
                    when sousRemise.IteLngId is not null and remise.IteLngId is  null then
     
        -- sous remise //
                    (Cast( cast( leproduit.IteLng2 as float)/100 as decimal (10,2))*leproduit.IteMon2) - ((Cast( cast( leproduit.IteLng2 as float)/100 as decimal (10,2))*leproduit.IteMon2) * (Cast( cast( sousRemise.IteMon2 as float)/100 as decimal (10,5))))
                    when sousRemise.IteLngId is null and remise.IteLngId is not null then
     
        --  remise//
                    (Cast( cast( leproduit.IteLng2 as float)/100 as decimal (10,2))*leproduit.IteMon2) - ((Cast( cast( leproduit.IteLng2 as float)/100 as decimal (10,2))*leproduit.IteMon2) * (Cast( cast( remise.IteMon2 as float)/100 as decimal (10,5))))
                    else (Cast( cast( leproduit.IteLng2 as float)/100 as decimal (10,2))*leproduit.IteMon2) end) as Montant
     
    FROM   
    T_Projet INNER JOIN T_Item leproduit ON 'PJ' + convert(varchar,PrjLngId) = leproduit.IteStrIndex 
    Inner JOIN db_GENAPI.dbo.T_Produit ON leproduit.IteLng1=ProLngId 
    Inner JOIN db_GENAPI.dbo.T_Param ON ProLngSFamId=ParLngId 
     
    -- MontantRemisé
    Left JOIN T_Item sousRemise ON 'PJ' + convert(varchar,PrjLngId) +'R' = sousRemise.IteStrIndex and ProLngSFamId=sousRemise.IteLng1 and sousRemise.IteMon2 is not null 
    Left JOIN T_Item remise ON 'PJ' + convert(varchar,PrjLngId) +'R' = remise.IteStrIndex and ParLng4=remise.IteLng1 and remise.IteMon2 is not null
     
    -- Famille + SousFamille
    Inner JOIN db_GENAPI.dbo.T_Param P2 ON db_GENAPI.dbo.T_Produit.ProLngSFamId = P2.ParLngId 
    Inner JOIN db_GENAPI.dbo.T_Param P3 ON P2.ParLng4 = P3.ParLngId
     
    -- Etat du projet
    Inner JOIN T_Param Etat on T_Projet.PrjLngEtatId = Etat.ParLngId 
     
    --Le Dossier
    Inner join T_Dossier on T_Projet.PrjLngDosId = DosLngId
     
    WHERE 
    Etat.ParStrNom = ?
    And Year(PrjDat2) = ?
    And Month(PrjDat2) = ?
    And PrjDat2 is not null
     
    And P3.ParStrNom not in ('MAINTENANCE','SERVICES COMPLEMENTAIRES')
    And P3.ParStrNom not like '%ACCOMPAGNEMENT%'
     
    And PrjStrLibelle not like 'Echange%'
    And PrjStrLibelle not like 'Surcoût%'
    And ProStrNom not like 'Frais de rejet bancaire'
    And DosStrNom not like '%COMMANDES INTERNES%'
    And DosStrNom not like 'Icare Test'
    And ProStrNom not like 'Participation financière'
    And (PrjMonFacture) - (leproduit.IteMon2) not between -1000 AND 1000
     
    group by  
    DosStrCompta,
    DosLngId,
    DosStrNom,
    PrjLngId,
    PrjStrLibelle,
    PrjDat2,
    leproduit.IteMon2,
    PrjMonFacture
    Faire apparaitre la colonne "Diff" n'est peut être pas nécessaire car je le gère dans une colonne avec des formules de calculs.
    Cela est intéressant de l'intégrer, mais la colonne rajouté Diff comporte des petites erreur, de plus les lignes sont doublé triplé quadruplé etc...


    Merci à vous.

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 033
    Points : 9 331
    Points
    9 331
    Par défaut
    Il y a 2 ou 3 principes ESSENTIELS à comprendre quand on utilise GROUP BY


    Ici, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select ... ... from ... GROUP BY DosStrCompta,  DosLngId, DosStrNom, PrjLngId, PrjStrLibelle, PrjDat2, leproduit.IteMon2,  PrjMonFacture
    Donc tu obtiens une nouvelle ligne dans ton résultat pour chaque nouvelle combinaison de DosStrCompta, DosLngId, DosStrNom, PrjLngId, PrjStrLibelle, PrjDat2, leproduit.IteMon2, PrjMonFacture
    Et comme tu as mis les colonnes IteMon2 et PrjMonFacture dans le GROUP BY, SQL te donne un sous-total pour chaque valeur différente de IteMon2 et de PrjMonFacture.


    Pour construire une requête , quand on galère, la procédure à suivre est la suivante.

    Déjà bâtir une requête sans GROUP-BY, c'est à dire une requête qui va donner le DETAIL des données, et non pas des lignes de SOUS-TOTAUX.

    Construis cette requête, et montre nous cette requête.
    C'est une étape indispensable à faire.


    Ensuite, on s'attaque aux problèmes des sous-totaux.
    Mais c'est dans un second temps.

    Ton premier problème, ce n'est pas d'apprendre à virer les lignes entre -1000 et 1000, c'est d'apprendre à faire des requêtes avec GROUP BY.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 716
    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 716
    Points : 52 380
    Points
    52 380
    Billets dans le blog
    4
    Par défaut
    Cette requête est une véritable horreur !

    Pourquoi des LIKE qui servent à rien ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    And ProStrNom not like 'Frais de rejet bancaire'
    And DosStrNom not like 'Icare Test'
    And ProStrNom not like 'Participation financière'
    AUCUN JOKER UTILISÉ !

    Pourquoi un CONVERT dans votre jointure ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON 'PJ' + convert(varchar,PrjLngId) = leproduit.IteStrIndex
    Pourquoi des CAST de CAST en pagaille ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Cast( cast( leproduit.IteLng2 as float)/100 as decimal (10,2))
    Pourquoi des conditions redondantes ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    And Year(PrjDat2) = ?
    And Month(PrjDat2) = ?
    And PrjDat2 is not null
    Pensez-vous sincèrement que si Year(PrjDat2) a une valeur ou que Month(PrjDat2) a une valeur, alors PrjDat2 pourrait être NULL ?

    Bref, commencez par apprendre le langage SQL. Mon livre comme mon site peuvent vous y aider !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Problème requête SQL (HAVING COUNT / MAX)
    Par AuroreMu dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/11/2014, 18h24
  2. Requête SQL avec Having Count
    Par illight dans le forum Langage SQL
    Réponses: 9
    Dernier message: 22/10/2013, 15h00
  3. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 20h42
  4. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 19h38
  5. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/02/2003, 17h44

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