Problème de requete, COUNT, GROUP BY etc.

Problème de requete, COUNT, GROUP BY etc. - SQL/NoSQL - Programmation

Marsh Posté le 22-05-2007 à 12:25:11    

Hello

 

Mettons que j'aie cette table achats :

 

id_achat   id_livre    format
     1            1        papier
     2            1        carton
     3            2        carton
     4            2        carton
     5            1        papier

 


Je voudrais faire une requête qui me retourne, pour chaque id_livre, le nombre d'enregitrement pour lesquels format est "papier", et le nombre d'enregistrements pour lesquels format est "carton".
Ce qui me donnerais :

 

id_livre  nb_papier  nb_carton
    1            2            1
    2            0            2

 

Je trouve rien du coté de GROUP BY, COUNT etc... Il me faudrait une sorte de "COUNT WHERE" mais ça n'existe pas :D

 

Est-ce possible et si oui comment faire [:opus dei]


Message édité par theredled le 22-05-2007 à 12:29:25

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 22-05-2007 à 12:25:11   

Reply

Marsh Posté le 22-05-2007 à 13:55:15    

Oui c'est possible avec des requetes imbriquées, mais je pense que ça sera complètement pourri en terme de performances.
 
Un truc du genre :
 


select id_livre,
(
  select count(id_achat)
  from achats
  where id_livre = a.id_livre
  and format = "papier"
) as nb_papier,
(
  select count(id_achat)
  from achats
  where id_livre = a.id_livre
  and format = "carton"
) as nb_carton
from achats a
group by a.id_livre;



---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 22-05-2007 à 14:07:21    

sinon tu peux voir du cote de count()...group by...having...
 
select count(maColonne), mesColonnes
from maTable
where mesCondition
group by mesColonnes
having mesConditions

Reply

Marsh Posté le 22-05-2007 à 14:39:30    

J'ai eu une solution dans un autre forum, à savoir

 


Code :
  1. SELECT id_livre, sum(papier) AS papier, sum(carton) AS carton
  2. FROM  ( 
  3. SELECT id_livre, 
  4. CASE format WHEN 'papier' THEN sum(cnt) ELSE 0 END AS papier, 
  5. CASE format WHEN 'carton' THEN sum(cnt) ELSE 0 END AS carton 
  6. FROM (
  7.   SELECT id_livre, count(*) AS cnt, format   FROM achats 
  8.   GROUP BY id_livre, format
  9. ) AS t1 
  10. GROUP BY id_livre, format 
  11. ) AS t2
  12. GROUP BY id_livre;
 

mais la solution de cgo2 n'est pas mal non plus.


Message édité par theredled le 22-05-2007 à 14:40:11

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 22-05-2007 à 14:41:17    

cgo2 a écrit :

Oui c'est possible avec des requetes imbriquées, mais je pense que ça sera complètement pourri en terme de performances.


Pas trop le choix...


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 22-05-2007 à 14:51:33    

la même sans requete imbriqués:

Code :
  1. SELECT id_livre, 
  2. sum(CASE format WHEN 'papier' THEN 1 ELSE 0 END) AS papier, 
  3. sum(CASE format WHEN 'carton' THEN 1 ELSE 0 END) AS carton 
  4. FROM  achats 
  5. GROUP BY id_livre

Message cité 2 fois
Message édité par anapajari le 22-05-2007 à 14:51:58
Reply

Marsh Posté le 22-05-2007 à 14:55:20    

anapajari a écrit :

la même sans requete imbriqués:

Code :
  1. SELECT id_livre, 
  2. sum(CASE format WHEN 'papier' THEN 1 ELSE 0 END) AS papier, 
  3. sum(CASE format WHEN 'carton' THEN 1 ELSE 0 END) AS carton 
  4. FROM  achats 
  5. GROUP BY id_livre



C'est proprement génial :o


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 22-05-2007 à 14:59:49    

Ca m'amène à une question sur la façon dont MySQL fait les SUM et COUNT etc.
 
Est-ce qu'il fait le groupage avant ou après le matage des champs ?
 
 
J'ai plein d'autre champ à trouver, du style la somme des [prix des livres divisé par un pourcentage différent pour chaque achat], j'aimerais bien comprendre comment ça marche et ce qu'il est possible ou pas de faire...


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 22-05-2007 à 15:12:52    

Reply

Marsh Posté le 22-05-2007 à 16:54:55    

anapajari a écrit :

la même sans requete imbriqués:

Code :
  1. SELECT id_livre, 
  2. sum(CASE format WHEN 'papier' THEN 1 ELSE 0 END) AS papier, 
  3. sum(CASE format WHEN 'carton' THEN 1 ELSE 0 END) AS carton 
  4. FROM  achats 
  5. GROUP BY id_livre



 
 :love:


---------------
When it's from Finland it's good.  - Mon blog
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed