[MySQL] Requête Imbriquées + Calcul de pourcentage [Résolu]

jordane45 20610 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 24 avril 2018 Dernière intervention - 7 août 2013 à 16:00 - Dernière réponse : sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention
- 3 sept. 2013 à 11:23
Bonjour,

J'aurai besoin de vos lumières ^^


Je souhaiterais récupérer un certain nombre d'informations issues de deux tables + effectuer un calcul de pourcentage

** Je dispose donc de DEUX tables
- Une Table USERS ( ID , Nom, GROUPE,Date_INSCRIPTION )
- Une Table MODULES (ID, TITRE_Module , UserID,publication_date)

Je souhaites obtenir [Dans une même Requête] les champs suivants:
- Nombre de Modules réalisé par GROUPE
- Nombre de USERS appartenants à chaque GROUPE
- Pourcentage (rapport entre les deux infos ci-dessus)


-> Je parviens à récupérer le Nombre de MODULES par GROUPE (avec, comme vous pouvez le voir un facteur de DATE..)
SELECT tmpMOD.GROUPE as GROUPES ,COUNT(*) AS NB_MODULES
	  FROM (
	  SELECT DISTINCT M.UserID,G.*
	  FROM MODULE M
	      ,USERS U
	  WHERE M.UserID = U.id
	  GROUP BY M.id_User
	  HAVING Max(M.publication_date) > now() - interval 1 year
	  ) tmpMOD
	  group by tmpMOD.GROUPE


Et donc, comment faire en sorte d'avoir en plus :
SELECT GROUPE, Count(*) 
FROM USERS 
WHERE USERS.Date_INSCRIPTION > now() - interval 1 year



Merci pour votre aide.



NB: Ce ne sont pas les vrais noms de mes champs, ni même de mes tables, ce n'est qu'à titre d'exemple..



Afficher la suite 

13 réponses

Répondre au sujet
jordane45 20610 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 24 avril 2018 Dernière intervention - Modifié par ichiriac le 8/08/2013 à 20:03
0
Utile
toute la data dont tu as besoin pour tes calculs se trouve dans la table MODULE
Malheureusement, non..

- Dans ma table Module j'ai bien le nombre de personnes ayant utilisés les différents modules... mais pas le nombre "total" de personnes existantes dans chaque groupe.

- La table Module ne contient pas non plus les groupes des users...

voici à quoi pourrait ressemble la structure des tables (dans ma base "test") :
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET FOREIGN_KEY_CHECKS=0 */;

-- Dumping structure for table test.modules
DROP TABLE IF EXISTS 'modules';
CREATE TABLE IF NOT EXISTS 'modules' (
  'id' int(10) NOT NULL AUTO_INCREMENT,
  'Titre' varchar(50) NOT NULL,
  'UserID' int(10) NOT NULL,
  'Publication_Date' datetime NOT NULL,
  PRIMARY KEY ('id'),
  KEY 'UserID' ('UserID')
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

-- Dumping data for table test.modules: ~0 rows (approximately)
/*!40000 ALTER TABLE 'modules' DISABLE KEYS */;
INSERT INTO 'modules' ('id', 'Titre', 'UserID', 'Publication_Date') VALUES
 (1, 'Module 1', 1, '2013-08-08 13:20:50'),
 (2, 'Module 2', 1, '2013-08-08 13:20:50'),
 (3, 'Module 1', 2, '2013-08-08 13:20:50'),
 (4, 'Module 2', 2, '2013-08-08 13:20:50'),
 (5, 'Module 3', 2, '2013-08-08 13:20:50'),
 (6, 'Module 1', 3, '2013-08-08 13:20:50');
/*!40000 ALTER TABLE 'modules' ENABLE KEYS */;


-- Dumping structure for table test.users
DROP TABLE IF EXISTS 'users';
CREATE TABLE IF NOT EXISTS 'users' (
  'id' int(10) NOT NULL AUTO_INCREMENT,
  'nom' varchar(50) NOT NULL,
  'Groupe' varchar(50) NOT NULL,
  'DateInscription' datetime NOT NULL,
  PRIMARY KEY ('id')
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

-- Dumping data for table test.users: ~0 rows (approximately)
/*!40000 ALTER TABLE 'users' DISABLE KEYS */;
INSERT INTO 'users' ('id', 'nom', 'Groupe', 'DateInscription') VALUES
 (1, 'TOTO', 'Grp1', '2013-08-08 13:22:20'),
 (2, 'ZZ', 'Grp1', '2013-08-08 13:22:20'),
 (3, 'FF', 'Grp1', '2013-08-08 13:22:20'),
 (4, 'GG', 'Grp1', '2013-08-08 13:22:20'),
 (5, 'HH', 'Grp2', '2013-08-08 13:22:20'),
 (6, 'II', 'Grp3', '2013-08-08 13:22:20'),
 (7, 'JJ', 'Grp2', '2013-08-08 13:22:20'),
 (8, 'KK', 'Grp1', '2013-08-08 13:22:20');
/*!40000 ALTER TABLE 'users' ENABLE KEYS */;
/*!40014 SET FOREIGN_KEY_CHECKS=1 */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;



Cordialement,
Jordane
____________________________________________
Commenter la réponse de jordane45
jordane45 20610 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 24 avril 2018 Dernière intervention - 8 août 2013 à 14:05
0
Utile
Rappel du besoin :

Je souhaites avoir :

Nombre de Module par User Par groupe ( table USERS et MODULES)
Nombre total de personnes Par Groupe ( table USERS ) [ et pas seulement celles présentes dans les modules.. non non..TOUTES les personnes de la table ]
Commenter la réponse de jordane45
jordane45 20610 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 24 avril 2018 Dernière intervention - 8 août 2013 à 18:56
0
Utile
1
Si personne n'a d'idée, je vais surement devoir passer par deux requêtes séparées... mais ça m'ennuie pour la suite de mon traitement....
Sniff...


ichiriac 195 Messages postés lundi 28 janvier 2013Date d'inscription 13 janvier 2017 Dernière intervention - 8 août 2013 à 20:04
Mais c'est compliqué aussi ce que tu demandes ^^

Des fois vaut mieux deux requettes optimisées qu'une seule lente ou mal optimisé ...
Commenter la réponse de jordane45
jordane45 20610 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 24 avril 2018 Dernière intervention - 8 août 2013 à 20:15
0
Utile
Si ça avait été simple je n'aurais pas eu besoin de votre aide

:-)

Commenter la réponse de jordane45
jordane45 20610 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 24 avril 2018 Dernière intervention - 3 sept. 2013 à 01:26
0
Utile
Hello.
Vu la structure de mes tables et les informations dont j'ai besoin je n'ai pas eu d'autre choix que de réaliser plusieurs requêtes séparées.
Je clos ce sujet.

Merci de vous y être intéressé.
Commenter la réponse de jordane45
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 3 sept. 2013 à 10:05
0
Utile
3
Désolé, j'arrive après la bataille. Tu bosses toujours dessus ?
C'est quoi le pourcentage que tu veux récupérer ? Je comprends pas bien...
jordane45 20610 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 24 avril 2018 Dernière intervention - 3 sept. 2013 à 10:20
C'est gentil de t'y intéresser , je suis passé par deux requête séparées pour réaliser ce traitement... mais bon, même si je n'en ai plus vraiment besoin cela pourrait toujours être intéressant si quelqu'un avait une réponse.

Sans s'occuper du pourcentage (simple division..), il faut que je puisse récupérer à la fois :
- Le Nombre de personnes appartenant à chaque groupe (présentes OU NON dans les modules)
- Le Nombre de module réalisé par groupe


Mais bon, si cela ne vous inspire pas ce n'est pas grave... en passant par deux requêtes séparées j'ai pu obtenir les informations dont j'avais besoin.
En tout cas, merci . ^^
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 3 sept. 2013 à 10:36
Est-ce qu'un user peut être dans plusieurs groupes ?
jordane45 20610 Messages postés mercredi 22 octobre 2003Date d'inscriptionContributeurStatut 24 avril 2018 Dernière intervention - 3 sept. 2013 à 10:51
non.
Commenter la réponse de sp40
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 3 sept. 2013 à 11:22
0
Utile
1
Est-ce que ça ne pourrait pas faire l'affaire ?

Select t1.GROUPE, count(distinct t1.ID) as NB_USERS, count(distinct t2.TITRE) as NB_MODULES
from USERS t1
left join MODULES t2 on t1.ID = t2.UserID
Group by t1.GROUPE
Order by t1.GROUPE;


sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 3 sept. 2013 à 11:23
J'ai oublié la clause sur la date...
Commenter la réponse de sp40
ichiriac 195 Messages postés lundi 28 janvier 2013Date d'inscription 13 janvier 2017 Dernière intervention - 7 août 2013 à 18:48
-1
Utile
Salut Jordane45,

Tu n'as pas besoin d'imbriquer tes requests, ou même faire une jointure, toute la data dont tu as besoin pour tes calculs se trouve dans la table MODULE :

SELECT
    M.GROUPE,
    COUNT(DISTINCT M.id) as NB_MODULES,
    COUNT(DISTINCT M.UserId) as NB_USERS,
    NB_MODULES / NB_USERS * 100 as PERCENT
FROM MODULE M
WHERE 
    M.publication_date > now() - interval 1 year
GROUP BY
     M.GROUPE


NB : Je suis parti du principe que la table MODULE à une colonne id qui définit son instance ... mais j'aurais aussi pû utiliser count(*) vu les cardinalités ...
Commenter la réponse de ichiriac

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.