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 :

Regrouper un grille tarifaire


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut Regrouper un grille tarifaire
    Bonjour à tous,

    je me prends la tête avec une requête, qui me semblait simple (et qu'y l'est certainement !) , mais je tourne en rond depuis un moment ...

    J'ai 4 tables :

    - Articles
    - Type de client
    - Période de location
    - Tarif

    Les liaisons sont de ce type :

    Nom : grille_table.png
Affichages : 115
Taille : 16,8 Ko

    Chaque tarif dépend de l'article, du type de client et de la période de location.

    J'essaie vainement de tourner le truc pour arriver à un résultat de ce type avec ma requête :

    Nom : grille_table_2.png
Affichages : 97
Taille : 10,2 Ko

    Je peux bien lister sous forme avec une simple requête et ses liaisons, mais c'est pas vraiment ce que je recherche a faire ...

    Nom : grille_table_3.png
Affichages : 105
Taille : 7,0 Ko



    Une idée ?

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 103
    Points : 8 216
    Points
    8 216
    Billets dans le blog
    17
    Par défaut
    Tu veux faire un pivot. Je crois qu'il existe des fonctions avec PostgreSQL ou MS SQL Server, mais tu ne précises pas ton SGBDR.

    Avec MySQL il faut faire 1 jointure par colonne supplémentaire ou jouer sur les groupements.

    Solution avec un GROUP BY :

    with
    	type_client (id, libelle) as (
    		values
    			row (1, 'Privé'),
    			row (2, 'Professionnel')
    	),
    	type_periode (id, libelle) as (
    		values
    			row (1, '0-5 jours'),
    			row (2, '6-10 jours')
    	),
    	article (id, libelle) as (
    		values
    			row (1, 'Cane à pêche'),
    			row (2, 'Piano droit')
    	),
    	tarif (id, type_client_id, type_periode_id, article_id, prix) as (
    		values 
    			row (1, 1, 1, 1, 20),
    			row (2, 1, 2, 1, 25),
    			row (3, 2, 1, 1, 22),
    			row (4, 2, 2, 1, 27),
    			row (5, 1, 1, 2, 120),
    			row (6, 1, 2, 2, 110),
    			row (7, 2, 1, 2, 115),
    			row (8, 2, 2, 2, 135)
    	)
    select all
    	tp.libelle as "Période de location",
    	group_concat(case when t.type_client_id = 1 then t.prix end) as "Privé",
    	group_concat(case when t.type_client_id = 2 then t.prix end) as "Professionnel"
    from tarif as t
    inner join type_periode as tp on t.type_periode_id = tp.id
    where t.article_id = 1
    group by 1
    ;
    Résultat :

    Période de location Privé Professionnel
    ------------------- ----- -------------
    0-5 jours              20            22
    6-10 jours             25            27
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Autre possibilité :

    Code SQL : 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
     
    with AR_article (AR_id, AR_lib) as
        (select 1, 'canne à pêche'   union all
         select 2, 'piano droit'     
        )                            
       , YC_type_client(YC_id, YC_lib) as
        (select 1, 'privé'           union all
         select 2, 'professionnel'   
        )                            
       , LP_loc_periode(LP_id, LP_lib) as
        (select 1, '0 - 5 jours'     union all
         select 2, '6 - 10 jours'    
        )
       , TA_tarif (YC_id, LP_id, AR_id, TA_prix) as
        (select 1, 1, 1, 020   union all 
         select 1, 2, 1, 025   union all
         select 2, 1, 1, 022   union all
         select 2, 2, 1, 027   union all
         select 1, 1, 2, 120   union all
         select 1, 2, 2, 110   union all
         select 2, 1, 2, 115   union all
         select 2, 2, 2, 135
        )
    select ART.AR_lib  as "Article"
         , PER.LP_lib  as "Période"
         , PRV.TA_prix as "Privé"
         , PRO.TA_prix as "Pro"
    from AR_article as ART
    cross join
         LP_loc_periode as PER
    left join 
        (select LP_id
              , TA_prix
              , AR_id
         from TA_tarif as TA1
         where TA1.YC_id = 1 -- client privé
        ) as PRV
       on PRV.AR_id = ART.AR_id
      and PRV.LP_id = PER.LP_id
    left join 
        (select LP_id  
              , TA_prix
              , AR_id  
         from TA_tarif as TA2
         where TA2.YC_id = 2 -- client pro
        ) as PRO
       on PRO.AR_id = ART.AR_id
      and PRO.LP_id=PER.LP_id
    order by 1, 2


    Résultat :

    Nom : Sans titre.png
Affichages : 75
Taille : 4,5 Ko

  4. #4
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Merci pour les réponses, je vais potasser un peu tout ça ...

    Une question , dans les deux exemples, je vois qu'il y a des valeurs en dur , comme "canne à pêche", ou le type "Privé" / "Professionnel".

    Ces infos ne sont pas statiques, mais proviennent des tables liées et ne sont pas connues à l'avance ...

    C'est pas simple votre "pivot"

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    L'un comme l'autre nous avons utilisé les valeurs "en dur" pour reproduire l'échantillon de test fourni dans la question, mais ça ne change rien au principe des solutions proposées : il suffit de remplacer les CTE déclarées par WITH par les tables contenant les valeurs (ou, de préférence, les vues associées à ces tables).

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 103
    Points : 8 216
    Points
    8 216
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par wd_newbie Voir le message
    Une question , dans les deux exemples, je vois qu'il y a des valeurs en dur , comme "canne à pêche", ou le type "Privé" / "Professionnel".

    Ces infos ne sont pas statiques, mais proviennent des tables liées et ne sont pas connues à l'avance ...

    Les CTE (WITH ...) servent à rendre les requêtes exécutables en l'état => Elles embarquent leurs données, pour l'exemple

    On a du faire cela car tu ne fournissais ni le DDL, et ni un échantillon
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par wd_newbie Voir le message
    ... Une question , dans les deux exemples, je vois qu'il y a des valeurs en dur , comme "canne à pêche", ou le type "Privé" / "Professionnel"....
    En sus des explications données, le liens pour le respect de la charte de postage :

    https://www.developpez.net/forums/a6...gage-sql-lire/

    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. Unite 2016 Europe : nouvelle grille tarifaire pour le moteur de jeux vidéo Unity
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 04/06/2016, 01h10
  2. Aide exercice C++ grille tarifaire
    Par oxy180 dans le forum Débuter
    Réponses: 9
    Dernier message: 14/09/2013, 21h47
  3. Création de sites et grille tarifaire
    Par BIG MIKE dans le forum Devis
    Réponses: 1
    Dernier message: 18/02/2010, 00h09
  4. jaimerais savoir commen creer une grille.......
    Par zephyr dans le forum Flash
    Réponses: 5
    Dernier message: 29/04/2003, 12h14
  5. [VB6] [Interface] Grille avec combobox
    Par khany dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/01/2003, 09h55

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