Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/11/2011, 20h46   #1
Invité régulier
 
Homme Théodore ROJKOFF
Consultant informatique
Inscription : mars 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Théodore ROJKOFF
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : mars 2010
Messages : 17
Points : 7
Points : 7
Par défaut Requête SQL de Fusion 3 en 1

Je ne parviens pas à réaliser la requête de Fusion de 2 tables Article et Tarif en une seule occurrence par Article en mentionnant les tarifs respectifs du champ Prix de la table 2 Tarif dans 3 colonnes différentes (Tarif1, Tarif2 et Tarif3).

Table 1 : ARTICLE (Article.Code, Article.Nom, Article.PrixBase)
Clef primaire : Article.Code
Exemple :
Code Nom PrixBase
AAA Article AAA 12.00
BBB Article BBB 8.90
CCC Article CCC 128.00
Et
Table 2 : TARIF (Tarif.CodeArticle, Tarif.TypeTarif, Tarif.PrixTarif)
avec 3 Types de tarifs : 1, 2 et 3
Relation N/1 avec la Table ARTICLE
Exemple :
CodeArticle TypeTarif PrixTarif
AAA 1 12.00
AAA 2 13.00
AAA 3 15.00
BBB 1 9.00
BBB 2 8.95
BBB 3 10.00
CCC 1 128.00
CCC 2 128.00
CCC 3 130.00

Je voudrais obtenir la vue suivante :
Code Nom PrixBase Tarif1 Tarif2 Tarif3
AAA Article AAA 12.00 12.00 13.00 15.00
BBB Article BBB 8.90 9.00 8.95 10.00
CCC Article CCC 128.00 128.00 128.00 130.00

PROJET DE REQUETE SQL… qui ne marche pas bien évidemment.
Code sql :
1
2
SELECT Article.Code, Article.nom, Article.PrixBase, iif(Tarif.TypeTarif="1",Tarif.Prix,0) AS Tarif1, iif(Tarif.TypeTarif="2",Tarif.Prix,0) AS Tarif2, iif(Tarif.TypeTarif="3",Tarif.Prix,0) AS Tarif3 
FROM Article INNER JOIN Tarif ON Tarif.[CodeArticle] = Article.Code

Pouvez-vous m'aider ?
Fiédia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 20h15   #2
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Maintenance données produits
Secteur : Distribution

Informations forums :
Inscription : décembre 2005
Messages : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

Une requête analyse croisée peut faire l'affaire :
Code sql :
1
2
3
4
5
TRANSFORM First(TARIF.PrixTarif) AS PremierDePrixTarif
SELECT ARTICLE.Code, ARTICLE.Nom, ARTICLE.PrixBase
FROM ARTICLE INNER JOIN TARIF ON ARTICLE.Code = TARIF.CodeArticle
GROUP BY ARTICLE.Code, ARTICLE.Nom, ARTICLE.PrixBase
PIVOT "Tarif" & [TARIF].[TypeTarif];
L'expression qui suit PIVOT crée les en-têtes de colonne Tarif1, Tarif2, Tarif3.
Celle qui suit TRANSFORM fournit les valeurs à mettre dans les colonnes de PIVOT (Tarif1, Tarif2, Tarif3).
Comme une requête analyse croisée est basée sur une requête de regroupement, il faut une fonction de regroupement domaine.
J'ai choisi First.
Si tu n'as pas de doublons dans TARIF sur CodeArticle+TypeTarif, cela fonctionne.

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 22h07   #3
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 895
Points : 3 895
salut LedZeppII et bienvenu Fiédia,

une autre approche :
Code SQL :
1
2
3
4
5
6
7
8
9
SELECT
   Code,
   Nom,
   PrixBase,
   Max(IIf([TypeTarif]=1,[PrixTarif])) AS Tarif1,
   Max(IIf([TypeTarif]=2,[PrixTarif])) AS Tarif2,
   Max(IIf([TypeTarif]=3,[PrixTarif])) AS Tarif3
FROM ARTICLE LEFT JOIN TARIF ON ARTICLE.Code = TARIF.CodeArticle
GROUP BY Code, Nom, PrixBase;
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 11h30   #4
Invité régulier
 
Homme Théodore ROJKOFF
Consultant informatique
Inscription : mars 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Théodore ROJKOFF
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : mars 2010
Messages : 17
Points : 7
Points : 7
Merci LedZeppII pour votre aide.

Hélas, le logiciel de SAGE PE n'accepte pas ce type de requête SQL.

Cordialement.

Fiédia
Fiédia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 11h38   #5
Invité régulier
 
Homme Théodore ROJKOFF
Consultant informatique
Inscription : mars 2010
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Théodore ROJKOFF
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : mars 2010
Messages : 17
Points : 7
Points : 7
Citation:
Envoyé par vodiem Voir le message
salut LedZeppII et bienvenu Fiédia,

une autre approche :
Code SQL :
1
2
3
4
5
6
7
8
9
SELECT
   Code,
   Nom,
   PrixBase,
   Max(IIf([TypeTarif]=1,[PrixTarif])) AS Tarif1,
   Max(IIf([TypeTarif]=2,[PrixTarif])) AS Tarif2,
   Max(IIf([TypeTarif]=3,[PrixTarif])) AS Tarif3
FROM ARTICLE LEFT JOIN TARIF ON ARTICLE.Code = TARIF.CodeArticle
GROUP BY Code, Nom, PrixBase;
Merci pour votre aide. La requête fonctionne parfaitement. Si cette réponse peut aider un autre développeur novice, il faut noter que le champ TypeTarif étant de type caractères la comparaison se fait avec "1", "2" et "3" au lieu de 1, 2 ou 3.

Une fois encore merci.

Cordialement.

Fiédia
Fiédia est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h13.


 
 
 
 
Partenaires

Hébergement Web