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 :

Code pour un sous-calcul


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 361
    Par défaut Code pour un sous-calcul
    Bonjour,

    j'ai une base de données (tableau noir) à partir de laquelle j'essaie d'afficher les résultats du tableau vert pour chaque numéro de commande.

    mais ce tableau de resultat necessite un sous calcul au sein du num commande qui me complique la vie... j'aimerai en effet distinguer les valeurs pour les "familles" qui ont au moins 2 lignes (j'ai illustré cela avec mes 2 colonnes en jaune à droite)

    Nom : dev4.png
Affichages : 279
Taille : 130,0 Ko

    le calcul basique est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select 
    num_commande, sum(ligne), count(distinct code_article) , count(distinct famille) 
    from Table_commande
    group by num_commande
    mais je ne sais pas comment ajouter le sous calcul illustré...

    merci de votre aide

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Bonjour,

    Une des manières de résoudre ce problème :
    1. Calculer la somme des lignes pour chaque commande ayant plus d'une ligne par famille
    2. Faire une jointure sur le numéro de commande avec la première requête
    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 éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 361
    Par défaut
    merci de votre aide

    Justement je bloque sur le point 1.
    Je ne sais pas comment faire dans le code car je veux un regroupement par num commande dans le tableau de résultat mais avec des colonnes supplémentaires qui distingueront les familles > 1 ligne au sein de cette commande.


    merci d'avance

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Il faut procéder par étapes et préparer d'abord la sous-requête §1

    Calculer la somme des lignes pour chaque commande ayant plus d'une ligne par famille
    J'aurais du détailler :
    1. Somme des lignes par commande et par famille
    2. Une piste supplémentaire : En anglais, ayant se traduit par ...


    La théorie : Formez des sous ensembles avec GROUP BY - Agrégez avec SUM, COUNT, MAX, MIN, AVG... - Filtrer les agrégats
    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
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 361
    Par défaut
    merci al1_24

    effectivement avec le code ci-dessous j'arrive à avoir le détail filtré uniquement sur ce que je veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select 
    num_commande, sum(ligne), count(distinct code_article) 
    from Table_commande
    group by num_commande, famille
    having sum(ligne) > 1
    neanmoins, maintenant je ne sais pas comment revenir sur la table de resultat qui regroupe uniquement par commande et mettre les valeurs sommées du code ci dessus...

    j'ai compris qu'il faudra faire un LEFT JOIN mais je sais pas comment faire cela

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Citation Envoyé par awa123 Voir le message
    j'ai compris qu'il faudra faire un LEFT JOIN mais je sais pas comment faire cela
    Tout est là : Les jointures
    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.

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 361
    Par défaut
    j'ai tenté la requete suivante mais je constate que les resultats sont incohérents

    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
    SELECT t1.num_commande
    	,sum(t1.ligne)
    	,count(DISTINCT t1.code_article)
    	,count(DISTINCT t1.famille)
    	,sum(t2.ligne)
    	,count(DISTINCT t2.famille)
    FROM Table_commande t1
    LEFT JOIN Table_commande t2 ON t1.num_commande = t2.num_commande
    WHERE t2.num_commande IN (
    		SELECT t2.num_commande
    		FROM Table_commande t2
    		GROUP BY t2.num_commande
    			,t2.famille
    		HAVING sum(t2.ligne) > 1
    		)
    GROUP BY t1.num_commande
    merci d'avance de votre aide

  8. #8
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 470
    Par défaut
    Bonjour,
    Tu as mis une restriction sur T2 dans la clause WHERE, ce qui change la jointure externe en jointure interne.
    Il faut déplacer le In dans la jointure.

    Tatayo.

  9. #9
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 361
    Par défaut
    je n'y arrive pas, lorsque je met le In dans la jointure y'a un pb

    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
     
    SELECT t1.num_commande
    	,sum(t1.ligne)
    	,count(DISTINCT t1.code_article)
    	,count(DISTINCT t1.famille)
    	,sum(t2.ligne)
    	,count(DISTINCT t2.famille)
    FROM Table_commande t1
    LEFT JOIN Table_commande t2                       
    WHERE t2.num_commande IN (
    		SELECT t2.num_commande
    		FROM Table_commande t2
    		GROUP BY t2.num_commande
    			,t2.famille
    		HAVING sum(t2.ligne) > 1
    		)
    ON t1.num_commande = t2.num_commande
    GROUP BY t1.num_commande

  10. #10
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 470
    Par défaut
    "Il y a un problème ".
    Tout à fait. Ta jointure est mal écrite.

    Tatayo.

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 650
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 650
    Billets dans le blog
    10
    Par défaut
    En effet, le mot clef ON doit être positionné immédiatement après la jointure JOIN et donc avant la restriction WHERE.

    De plus, mettre une restriction avec égalité sur une colonne de la table OUTER T2 remplace implicitement la jointure externe (OUTER JOIN) en jointure interne (INNER JOIN)

  12. #12
    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
    Ca dérive !
    Essayez ainsi :
    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
    with cte_commande_famille_groupe (num_commande, famille) as
    (
      select num_commande, famille
        from Table_commande
    group by num_commande, famille
      having sum(ligne) > 1
    )
        select t1.num_commande
             , sum(t1.ligne)
             , count(distinct t1.code_article)
             , count(distinct t1.famille)
             , count(distinct t2.famille)
             , count(t2.famille)
          from Table_commande              as t1
     left join cte_commande_famille_groupe as t2  on t2.num_commande = t1.num_commande
                                                 and t2.famille      = t1.famille
      group by t1.num_commande;

  13. #13
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 361
    Par défaut
    Bonjour,

    merci à tous de votre aide

    mille mercis Waldar pour la proposition de code, je ne connaissais pas du tout les tables dérivées CTE, je trouve ça hyper puissant et pratique !

    J'ai donc tenté de l'utiliser en faisant le test ci dessous mais je ne comprends pas le resultat de la "sum(t2.ligne)" qui devrait correspondre à la somme des lignes pour les familles qui sont > 1 ligne.
    par exemple pour le colis1 j'attend le resultat 4 car nous avons 2 familles de 2 lignes chacune (2 lignes de la familleA + 2 lignes de la familleB=4)
    pour le colis 4 j'attend le resultat de sum(t2.ligne) = 2 car dans le colis 4 il n'y a que familleD qui a > 1 ligne (en l'occurence la somme est de 2 lignes)

    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
    WITH cte_commande_famille_groupe (numero_colis ,famille,ligne)
    AS (
    	SELECT numero_colis,famille, sum(ligne)
    	FROM table_CTE
    	GROUP BY numero_colis, famille
    	HAVING sum(ligne) > 1
    	)
    SELECT t1.numero_colis
    	,sum(t1.ligne) sum_ligne
    	,count(DISTINCT t1.article) distinct_art
    	,count(DISTINCT t1.famille) distinct_fam
    	,count(DISTINCT t2.famille) distinct_fam_t2
    	,count(t2.ligne) count_ligne_t2
    	,sum(t2.ligne) sum_ligne_t2
    FROM table_CTE AS t1
    LEFT JOIN cte_commande_famille_groupe AS t2 ON t2.numero_colis = t1.numero_colis
    	AND t2.famille = t1.famille
    GROUP BY t1.numero_colis;
    Nom : cte.jpg
Affichages : 206
Taille : 213,9 Ko

    merci de votre aide

  14. #14
    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
    Parce que vous avez mal réappliqué la logique, je ne récupère pas la partie "sum ligne" dans la CTE de façon volontaire.
    Suivez la préconisation initiale : count(t2.famille) et count(distinct t2.famille).

    Edit : d'ailleurs vous les affichez bien, supprimez simplement le sum(t2.ligne). Regardez vos colonnes distinct_fam_t2 et count_ligne_t2 ils ont les chiffres que vous cherchez.

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

Discussions similaires

  1. Code pour un bouton Enregitrer sous
    Par AsmaHaj dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 22/05/2007, 00h02
  2. [VBA-E97]Code pour déprotéger une feuille de calcul
    Par blaiso dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/04/2007, 11h30
  3. Code pour verouiller un dossier sous Windows XP
    Par PHIL45 dans le forum Delphi
    Réponses: 2
    Dernier message: 26/12/2006, 13h01
  4. code pour enregistré un fichier sous different nom
    Par france38 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 28/10/2006, 13h31
  5. Réponses: 2
    Dernier message: 01/04/2003, 22h09

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