Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 19/12/2011, 11h04   #1
Membre éprouvé
 
Avatar de Dendrite
 
Femme Sylvie VAUTHIER
Développeuse Web
Inscription : juin 2008
Messages : 450
Détails du profil
Informations personnelles :
Nom : Femme Sylvie VAUTHIER
Âge : 46
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeuse Web
Secteur : Enseignement

Informations forums :
Inscription : juin 2008
Messages : 450
Points : 401
Points : 401
Par défaut retracer des données par mois

Bonjour,

Je me casse la tête depuis plusieurs jours sur le problème suivant :

Prenons une table employe(id,nom,prenom)
une table prime(id,id_employe,type,montant,debut,fin)

Debut et fin vont varier joyeusement et correspondre à des périodes de validité. Le type de primes également est très varié.

Je voudrais faire une vue qui rétablit l'année par mensualité, pour préparer un tableau html. J'aurais préféré traiter cela dès le sql plutôt qu'en PHP.
Du genre

DUPONT/Jean/Prime A/ montant Janvier/ montant Février/ montant mars.... / montant décembre
DUPONT/Jean/Prime B/ montant Janvier/ montant Février/ montant Mars.... / montant décembre
MARTIN/Jeanne/Prime B/ montant Janvier/ montant Février/ montant Mars.... / montant décembre
WATSON/James/Prime A/ montant Janvier/ montant Février/ montant Mars.... / montant décembre
WATSON/James/Prime F/ montant Janvier/ montant Février/ montant Mars.... / montant décembre

voici où j'en suis de mes... tentatives infructueuses :

Code :
1
2
3
4
5
6
7
8
9
SELECT DISTINCT employe.nom,employe.prenom,prime.type,
    sum(case when "2011-01-27" BETWEEN prime.debut AND prime.fin then prime.montant else 0 end) AS montant_01,
    sum(case when "2011-02-27" BETWEEN prime.debut AND prime.fin then prime.montant else 0 end) AS montant_02,
 etc...
    sum(case when "2011-12-27" BETWEEN prime.debut AND prime.fin then prime.montant else 0 end) AS montant_12
FROM employe,prime
WHERE prime.id_employe=employe.id
GROUP BY prime.id_employe,prime.type
ORDER BY nom,prenom,FIELD(prime.type,"C","A","B","F")
En gros, les sommes ne sont jamais les bonnes.
__________________
C'est moi qui l'ai fait !
PHP : Le tutoriel pour grands débutants pressés
Dendrite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h26   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
Bonjour,

A quoi sert votre distinct sachant que vous faites un group by ?

Sinon pour le problème initiale, pouvez-vous donner un exemple de donnée ?

Je suspect que votre problème réside dans votre test case / when, qui doit reprendre pour différent mois une prime.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 13h26   #3
Membre éprouvé
 
Avatar de Dendrite
 
Femme Sylvie VAUTHIER
Développeuse Web
Inscription : juin 2008
Messages : 450
Détails du profil
Informations personnelles :
Nom : Femme Sylvie VAUTHIER
Âge : 46
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeuse Web
Secteur : Enseignement

Informations forums :
Inscription : juin 2008
Messages : 450
Points : 401
Points : 401
Merci de votre réponse.
J'ai fini par trouver d'où venait le problème,il venait d'une jointure avec une troisième table, qui étant mal calée, renvoyait parfois deux valeurs, et sommait donc deux fois...
Pardon pour le dérangement.
__________________
C'est moi qui l'ai fait !
PHP : Le tutoriel pour grands débutants pressés
Dendrite 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 20h07.


 
 
 
 
Partenaires

Hébergement Web