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

Requêtes PostgreSQL Discussion :

Ordre de résultat & Soustraction


Sujet :

Requêtes PostgreSQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 30
    Points
    30
    Par défaut Ordre de résultat & Soustraction
    Bonjour,

    J'ai deux petits problèmes au niveau des requêtes SQL sur l'un de mes projets:

    1) Via la requête suivante, j'effectue une soustraction qui fonctionne très bien, j'obtiens bien POT_DEPART_CONGES.valeur - CONGES_PRIS.valeur dans ma colonne VALEUR. Le problème c'est que j'aimerais donner un nouvel intitulé à cette soustraction, car en ce moment, la requête va chercher le contenu de la colonne INDICATEUR, hors j'aimerais que dans la table, sous la colonne INDICATEUR apparaisse "Congés restants", et je ne sais pas si cela est possible sans altérer l'une ou l'autre table.

    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
     
    SELECT 
    	(SELECT valeur 
    	 FROM pot_depart_conges 
    	INNER JOIN secteurs
    	ON pot_depart_conges.numero_secteur = secteurs.id 
    	WHERE annee = '2018' AND secteur_name = 'Bouge')
    	- 
    	(SELECT valeur 
    	 FROM conges_pris 
    	INNER JOIN secteurs
    	ON conges_pris.numero_secteur = secteurs.id 
    	WHERE annee = '2018' AND secteur_name = 'Bouge' AND mois = 'Janvier') AS Valeur, 
    	pot_depart_conges.indicateur, secteurs.secteur_name, antenne
    FROM pot_depart_conges
    	INNER JOIN secteurs
    	ON pot_depart_conges.numero_secteur = secteurs.id
    	INNER JOIN conges_pris
    	ON pot_depart_conges.numero_secteur = conges_pris.numero_secteur
    WHERE secteur_name = 'Bouge'
    Qui me retourne donc :

    Valeur Indicateur secteur_name antenne
    1553 Pot départ congés Bouge Namur

    Le texte en rouge n'étant alors pas correct, puisque la valeur est Pot départ congés-Congés pris.





    2) J'ai une deuxième requête qui fonctionne également bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT annee, mois, indicateur, ROUND(SUM(valeur),2) AS valeur, secteur_name, antenne 
    FROM contingent 
    INNER JOIN secteurs
    ON contingent.numero_secteur = secteurs.id
    WHERE secteur_name = 'Bouge'
    AND mois = 'Janvier'
    AND annee = '2018'
    AND indicateur IN ('Total Heures dispo par mois (Base 38)',
                        'Nbre H Absentéisme (code M) (Base 38)',
                        'Nbre H Prestées (code PR) (Base 38)',
                        'Ecart H Dispo et H prestées (Base 38)') 
    GROUP BY annee, mois, indicateur, antenne, secteur_name
    A ceci près que les résultats apparaissent toujours dans cet ordre là :
    - Ecart H Dispo et H prestées (Base 38)
    - 'Nbre H Absentéisme (code M) (Base 38)
    - Nbre H Prestées (code PR) (Base 38)
    - Total Heures dispo par mois (Base 38)
    J'en déduis que la requête retourne naturellement les résultats par ordre alphabétique. Mon problème étant que les résultats s'interprètent dans un ordre bien précis, et je me demandais s'il y avait un moyen de forcer la requête à m'afficher les résultat dans l'ordre souhaité.

    J'espère avoir été assez clair, je me rends compte que ce n'est pas forcément évident à décrire.

    Un tout grand merci d'avance !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par Neufunk Voir le message
    je me rends compte que ce n'est pas forcément évident à décrire
    Merci pour l'effort mais il y a des petits couacs dans votre présentation.
    Dans la première requête, vous ne sélectionnez qu'une seule colonne (le résultat de la soustraction), hors vous en indiquez quatre dans votre résultat ce qui n'est pas possible.

    Accessoirement, je pense que votre requête est améliorable, si vous voulez un coup de main n'hésitez pas à publier la structure de vos tables ainsi qu'un jeu de données raisonnable (moins de 10 lignes), cohérent (il faut que les jointures fonctionne) et représentatif de votre problème.

    Quant à votre seconde requête, il suffit d'ajouter un ORDER BY afin de trier vos données comme bon vous semble.
    Vous pouvez, par exemple, écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    order by case indicateur
               when 'Total Heures dispo par mois (Base 38)' then 1
               when 'Nbre H Absentéisme (code M) (Base 38)' then 2
               when 'Nbre H Prestées (code PR) (Base 38)'   then 3
               when 'Ecart H Dispo et H prestées (Base 38)' then 4
               else 5
             end asc;

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 30
    Points
    30
    Par défaut
    Un tout grand merci pour ces réponses !

    J'ai pu trouver la solution à mon premier problème en testant diverses idées qui me passaient par la tête.

    Par contre le statement ORDER BY CASE fonctionne merveilleusement bien, j'ignorais que l'on pouvait mettre des conditions dans un ORDER BY, ça va grandement me faciliter la vie

    Par contre voici la tête de ma requête, ce n'est pas le plus sexy, mais est-ce que chercher à l'améliorer pourrait accélérer le temps d'exécution, sachant qu'elle ne retourne que 8 lignes maximum à chaque fois ? Elle est intégrée a un logiciel JAVA, et chaque WHERE est en fait une variable, j'ai donc penser à la transformer pour en faire un PreparedStatement, mais j'avoue que la déconstruction / reconstruction de cette énorme requête me décourage, surtout qu'elle fonctionne bien en l'état.
    Pour la lecture... C'est une autre histoire... Si jamais vous voyez des choses qui semblent redondantes ou incohérente juste en passant rapidement en vue cette requête, je serais néanmoins ravi de pouvoir les corriger.

    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
    SELECT * FROM (
    	SELECT annee, mois, indicateur, ROUND(SUM(valeur),2) AS valeur, secteur_name, antenne
    	FROM contingent
    	INNER JOIN secteurs
    	ON contingent.numero_secteur = secteurs.id
    	WHERE secteur_name = '" + secteur + "'
    	AND mois = '" + periode + "'
    	AND annee = '" + annee + "'
    	AND indicateur IN ('Total Heures dispo par mois (Base 38)',
    	'Nbre H Absentéisme (code M) (Base 38)',
    	'Nbre H Prestées (code PR) (Base 38)',
    	'Ecart H Dispo et H prestées (Base 38)')
    	GROUP BY annee, mois, indicateur, antenne, secteur_name
     
    	UNION ALL
     
    	SELECT annee, '', indicateur, ROUND(SUM(valeur),2) AS valeur, secteur_name, antenne
    	FROM pot_depart_conges
    	INNER JOIN secteurs
    	ON pot_depart_conges.numero_secteur = secteurs.id
    	WHERE secteur_name = '" + secteur + "'
    	AND annee = '" + annee + "'
    	GROUP BY indicateur, antenne, annee, secteur_name
     
    	UNION ALL
     
    	SELECT annee, mois, indicateur, ROUND(SUM(valeur),2) AS valeur, secteur_name, antenne
    	FROM conges_pris
    	INNER JOIN secteurs
    	ON conges_pris.numero_secteur = secteurs.id
    	WHERE secteur_name = '" + secteur + "'
    	AND mois = '" + additionPeriode + "'
    	AND annee = '" + annee + "'
    	GROUP BY indicateur, antenne, annee, mois, secteur_name
     
    	UNION ALL 
     
    	SELECT pot_depart_conges.annee, conges_pris.mois AS mois, 'Congés Restants',
    		(SELECT ROUND(SUM(valeur),2) AS valeur
    		FROM pot_depart_conges
    		INNER JOIN secteurs
    		ON pot_depart_conges.numero_secteur = secteurs.id
    		WHERE annee = '" + annee + "' AND antenne = '" + centre + "' AND secteur_name = '" + secteur +"')
    	-
    		(SELECT ROUND(SUM(valeur),2) AS valeur
    		FROM conges_pris
    		INNER JOIN secteurs
    		ON conges_pris.numero_secteur = secteurs.id
    		WHERE annee = '" + annee + "'
    		AND antenne = '" + centre + "'
    		AND secteur_name = '" + secteur + "'
    		AND mois = '" + additionPeriode + "') AS Soustraction,
    	secteur_name, antenne
    	FROM pot_depart_conges
    	INNER JOIN secteurs
    	ON pot_depart_conges.numero_secteur = secteurs.id
    	INNER JOIN conges_pris
    	ON pot_depart_conges.numero_secteur = conges_pris.numero_secteur
    	WHERE antenne = '" + centre + "'
    	AND mois = '" + additionPeriode + "'
    	AND secteur_name = '" + secteur + "'
    	AND pot_depart_conges.annee = '" + annee + "'
    	GROUP BY pot_depart_conges.indicateur, secteur_name, antenne, pot_depart_conges.annee, mois
     
    	UNION ALL
     
    	SELECT annee, '', indicateur, ROUND(SUM(valeur),2) AS valeur, secteur_name, antenne
    	FROM solde_heures_recup
    	INNER JOIN secteurs
    	ON solde_heures_recup.numero_secteur = secteurs.id
    	WHERE secteur_name = '" + secteur + "' " +
    	AND annee = '" + annee + "' " +
    	GROUP BY indicateur, antenne, annee, secteur_name
    ) alias
    order by case indicateur
    WHEN 'Total Heures dispo par mois (Base 38)' THEN 1
    WHEN 'Nbre H Prestées (code PR) (Base 38)'   THEN 2
    WHEN 'Ecart H Dispo et H prestées (Base 38)' THEN 3
    WHEN 'Nbre H Absentéisme (code M) (Base 38)' THEN 4
    WHEN 'Pot départ congés' THEN 5
    WHEN 'congés pris' THEN 6
    WHEN 'solde congés'THEN 7
    WHEN 'Solde heures récup' THEN 8
    END ASC;
    Quoi qu'il en soit, encore un tout grand merci pour votre aide.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je suis un peu perdu sur les noms de colonnes, dès que vous avez plus d'une table dans une requête prenez l'habitude d'utiliser un alias et de le répercuter sur toutes les colonnes.
    Par exemple dans ce bout de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	SELECT annee, mois, indicateur, ROUND(SUM(valeur),2) AS valeur, secteur_name, antenne
    	FROM contingent
    	INNER JOIN secteurs
    	ON contingent.numero_secteur = secteurs.id
    	WHERE secteur_name = '" + secteur + "'
    	AND mois = '" + periode + "'
    	AND annee = '" + annee + "'
    	AND indicateur IN ('Total Heures dispo par mois (Base 38)',
    	'Nbre H Absentéisme (code M) (Base 38)',
    	'Nbre H Prestées (code PR) (Base 38)',
    	'Ecart H Dispo et H prestées (Base 38)')
    	GROUP BY annee, mois, indicateur, antenne, secteur_name
    Je ne sais pas à quelle table appartiennent... toutes les colonnes hormis celles de la jointure.

Discussions similaires

  1. Ordre des résultats dans une recherche full text
    Par Idleman dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/07/2012, 15h00
  2. [Union] ordre des résultats
    Par spender dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/08/2008, 09h48
  3. Transformer les résultats d'une requête dans un autre ordre
    Par keikun dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/04/2006, 16h29
  4. [MySQL] Mauvais ordre de résultat d'une requête
    Par licorne dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 06/03/2006, 16h47
  5. ordre de présentation des résultats d'un état
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 30/09/2005, 19h12

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