Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 12/12/2011, 09h39   #1
 
Homme
Administrateur de base de données
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : -2
Points : -2
Par défaut Requête plusieurs valeurs pour une colonne identique

Bonjour,

Voici mon petit souci, j'ai une table avec les schéma suivant :

IDMagasin
IDDepartement
Mois
Annee
CA

Et je voudrais faire une requete, pour avoir les champs suivant :

Et je voudrais en une requete, avoir en ligne, l'identifiant du magasin, le département, et ensuite plusieurs CA concernant plusieurs mois différents, en gros, une requete avec des lignes résultats de la forme :

ID_MAGASIN, ID_DEPARTEMENT, CA MOIS 1, CA MOIS 2, CA MOIS 3

J'ai tout essayé, les jointures avec table identique, etc, mais rien ne me renvois le résultat attendu correct.

Avez vous une idée ?

Merci d'avance
daniel57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 10h01   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 922
Points : 1 922
Bonjour,
Certains diraient que c'est de la cosmétique, et donc du rôle de l'application, mais néanmoins c''est faisable en SQL:
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
SELECT idmag,sum(cam1),sum(cam2),sum(cam3)
FROM
(
SELECT idmag,sum(ca) AS cam1,0 AS cam2,0 AS cam3
FROM latabble WHERE mois = 'JANVIER'
GROUP BY idmag
union
SELECT idmag,0 AS cam1,sum(ca) AS cam2,0 AS cam3
FROM latabble WHERE mois = 'FEVRIER'
GROUP BY idmag
union
SELECT idmag,0 AS cam1,0 AS cam2,sum(ca) AS cam3
FROM latabble WHERE mois = 'MARS'
GROUP BY idmag
)
GROUP BY idmag

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 10h15   #3
 
Homme
Administrateur de base de données
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : -2
Points : -2
Merci Tatayo, toutefois, je me suis sans doute mal exprimé, car les CA ne sont pas à calculer, il faut juste restituer les valeurs présentes dans la table...

De cette façon, je n'ai pas trouvé de solution, et celle que tu proposes ne semble pas fonctionner non plus..

Ou alors je n'arrive pas à l'adapter.

Vraiment désolé, ce problème doit être simple, et me fait perdre un temps fou...
daniel57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 10h50   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
J'ai rajouté l'année dans la sélection mais si c'est inutile à retirer du SELECT et du GROUP BY
Code :
1
2
3
4
5
6
SELECT ID_MAGASIN, ID_DEPARTEMENT, Annee,
       max(case when mois = 1 then CA end) AS MOIS_1, 
       max(case when mois = 2 then CA end) AS MOIS_2, 
       max(case when mois = 3 then CA end) AS MOIS_3
  FROM latabble
 GROUP BY ID_MAGASIN, ID_DEPARTEMENT, Annee
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h02   #5
 
Homme
Administrateur de base de données
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : -2
Points : -2
Merci skuatamad.

Toutefois dans mon cas, ça ne marche pas.

J'ai l'impression d'être dans un cas sans solution.

daniel57 est déconnecté   Envoyer un message privé Réponse avec citation 03
Vieux 12/12/2011, 11h10   #6
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Bonjour,
Quand tu dis que ça ne marche pas ça veut dire quoi exactement ? Que tu as une erreur ou que le résultat renvoyé n'est pas correct ?
Si c'est une erreur donne nous le code et titre de l'erreur.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h30   #7
 
Homme
Administrateur de base de données
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : -2
Points : -2
Bonjour lola06,

Alors le résultat renvoyé n'est pas correct.
Sans doute parce que je n'ai pas correctement expliqué ma problèmatique.

Je reprend donc depuis le début :

J'ai une table, avec les infos suivantes :

Identifiant Magasin
Nom Magasin
Id Département
Mois
Annee
CA_réalisé

Je souhaite avoir une requête, qui prend 3 paramètres :

L'année, le mois, et le département.
Et cette requete doit me renvoyer une ligne avec L'id Magasin, le nom, le département, le mois, l'année et le CA Réalisé

Ainsi, cette requête me retourne par exemple pour chaque magasin du 67, la valeur du CA pour le mois de février 2011.

Jusque là, aucun souci, c'est une requête évident :

Code :
1
2
3
SELECT idMag, idDept, idMois, idAnnee idCA 
FROM maTable
WHERE idMois=2 AND idAnnee=2011 AND idDept=67;
Le souci, c'est que j'aimerai, dans la même requête, et sur la même ligne résultat, avoir en plus le CA du mois précédent, mais UNIQUEMENT pour les magasin présent dans la requête du mois en cours, c'est à dire qu'aucune ligne ne doit disparaitre, et aucune ne dois être ajoutée.

En fait, j'aimerais avoir exactement le même résultat que dans la requête indiqué au dessus, avec une colonne en plus, le CA du mois précédent.

Si quelqu'un à une idée... C'est un grand merci.
daniel57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h38   #8
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Bonjour,

Code :
1
2
3
4
5
6
7
SELECT m1.idMag, m1.idDept, m1.idMois, m1.idAnnee, m1.idCA  CA_Courant, m2.CA_Precedent
FROM maTable m1
LEFT OUTER JOIN (SELECT idMag, idCA CA_Precedent
        FROM maTable 
        WHERE idMois=to_char(sysdate-1,'MM')) m2
ON m1.idMag = m2.idMag
WHERE m1.idMois=to_char(sysdate,'MM') AND m1.idAnnee=2011 AND m1.idDept=67;
Cette requête pourrait-elle marcher ?
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h48   #9
 
Homme
Administrateur de base de données
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : -2
Points : -2
Merci Lolo06 pour ta réponse, malheureusement la encore la requête ne m'apporte pas le résultat attendu, il y a 2 lignes par idMag...

J'attends 199 lignes de résultats, il y en a 350.
daniel57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h48   #10
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Code :
1
2
3
4
5
6
7
8
SELECT idMag, idDept, idAnnee
,max(case when mois = 1 then isnull(CA,0) else 0 end) AS MOIS_1
,max(case when mois = 2 then isnull(CA,0) else 0 end) AS MOIS_2
FROM maTable
WHERE idMois IN (1,2) 
AND idAnnee=2011 
AND idDept=67
GROUP BY idMag, idDept, idAnnee
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h58   #11
 
Homme
Administrateur de base de données
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : -2
Points : -2
Lola06,

En fait, ta requête semble marcher, si j'ajoute dans ton code l'année et le dépt dans ta requête du mois précédent.

ça te semble juste quand même ?

Code :
1
2
3
4
5
6
7
8
 
SELECT m1.idMag, m1.idDept, m1.idMois, m1.idAnnee, m1.idCA  CA_Courant, m2.CA_Precedent
FROM maTable m1
LEFT OUTER JOIN (SELECT idMag, idCA CA_Precedent
        FROM maTable 
        WHERE idMois=to_char(sysdate-1,'MM') AND m2.idAnnee=2011 AND m2.idDept=67) m2
ON m1.idMag = m2.idMag
WHERE m1.idMois=to_char(sysdate,'MM') AND m1.idAnnee=2011 AND m1.idDept=67;
daniel57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h59   #12
 
Homme
Administrateur de base de données
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : -2
Points : -2
Merci Jean-Cri, mais j'ai déjà essayé ta solution, mais mon souci est lorsque l'on est au mois de janvier... Il faut être sur 2011 et 2010.
daniel57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h03   #13
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Oui effectivement j'avais oublié l'année et le département. Pour moi ça ma semble correct.

Si tu veux faire plus générique tu peux aussi faire pour l'année en cours.
Mais c'est un peu plus délicat lorsqu'il y a changement d'année.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h03   #14
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut,

Fais un petit effort, utilise partout où il faut un CASE WHEN pour passer le mois à 12 et l'année à année -1 quand l'id vaut 1 !

T'es un dba pur maintenance en fait ?
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h05   #15
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Merci de lire les règles du forum et de fournir toutes les informations utiles dans le premier message.
Les scripts permettant de créer les tables, de remplir un jeu d'essai, la requête que vous avez écrite, ce qu'elle renvoie, ce que vous attendez et bien entendu votre SGBD.

Vous rendez-vous compte du temps que vous faites perdre à ceux qui essaient de vous aider en distillant les informations au compte-goûte ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h13   #16
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Si tu sais que tu es en janvier, il te faudra bien l'expliquer a ta requete ...
et si tu arrives à l'exprimer dans ta requete, tu seras capable de retrouver le mois et l'année du mois precedent avec dateadd par exemple.
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h17   #17
 
Homme
Administrateur de base de données
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 9
Points : -2
Points : -2
Waldar : je ferai attention, c'est promis. Toutefois, ce n'est pas nécessaire de me tomber dessus de la sorte.

pacmann : Merci, oui maintenance, et ok pour ta solution. Toutefois, j'ai essayé, et je ne peux pas utiliser cette solution. Après, comme vous l'avez tous remarqué, je n'ai encore que peu d'expérience en requêtage. Merci pour ton aide.

lola06 : merci beaucoup pour ta solution. Après diverse vérification, ça semble coller. Merci.
daniel57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h27.


 
 
 
 
Partenaires

Hébergement Web