Groupé par les 3 première lettre, sql

Groupé par les 3 première lettre, sql - SQL/NoSQL - Programmation

Marsh Posté le 05-05-2009 à 15:55:38    

Bonjour,
 
j'ai un petit problème dans ma requete actuel je prend tous les customers_from qui commence par 1st et les regroupes mais mon problème c'est que je veu fair la même chose mais sur tous le champs customers_from
 
car par exemple j'ai dans mon champs les noms suivants :
 
1st_qwe, 1st_asd, 1st_ghj, 1st_poi, add_qwe, add_rtz, add_lkj, add_puz, poi_ghj, poi_gjhgj, poi_tgb etc...
 
donc j'aimerai prendre les trois preière lettre et fair ma condition comme celle là  

Code :
  1. SELECT IF(customers_from LIKE '1st%','1rst',customers_from) AS Origin,
  2.                               COUNT(cu.customers_id) AS effectif_vg
  3.                                FROM en_customers cu inner join en_commandes co on cu.customers_id=co.customers_id
  4.                                WHERE customers_gratuite='1'
  5.                                GROUP BY Origin "


 
 
Merci a toute personne qui peu m'éclaircir

Reply

Marsh Posté le 05-05-2009 à 15:55:38   

Reply

Marsh Posté le 05-05-2009 à 16:26:43    

y-a-t-il une solution a mon problème???

Reply

Marsh Posté le 05-05-2009 à 16:26:48    

Bonjour,
 
Si tu fais une requête dans ce genre :  
 
SELECT  
LEFT(CU.customers_from, 3) AS Origin,
COUNT(CU.customers_id) AS Effectif_Vg
FROM EN_CUSTOMER CU
INNER JOIN EN_COMMANDES CO ON CU.customers_id = CO.customers_id
WHERE ***CO ou CU ??? *** .customers_gratuite = '1'
GROUP BY LEFT(CU.customers_from, 3)
 
Ca doit fonctionner non ?
 
Par contre, je ne sais pas ce que ça fait si tu as des customers_from qui ont une longueur < 3, sur MySQL, ça regroupe quand même...
 
Bon courage,
 
EDIT : 5 secondes trop tard apparemment...


Message édité par Tibar le 05-05-2009 à 16:28:16
Reply

Marsh Posté le 05-05-2009 à 16:27:13    

Avec Oracle, et certains autres SGBD, on peut utiliser substr(champ, indice_de_depart_commencant_a_1, longueur), ce qui donne :

Code :
  1. SELECT substr(customers_from, 1, 3) AS Origin,
  2.                               COUNT(cu.customers_id) AS effectif_vg
  3.          FROM en_customers cu inner join en_commandes co on cu.customers_id=co.customers_id
  4.         WHERE customers_gratuite='1'
  5.          GROUP BY Origin "


Edit : Ou avec left, qui est aussi bien. J'ai répondu sans voir le message d'avant.


Message édité par olivthill le 05-05-2009 à 16:36:37
Reply

Marsh Posté le 05-05-2009 à 16:34:17    

Ok, le SUBSTR semble un peu plus générique, je suis habitué à LEFT ou RIGHT, sous MySQL, on peut faire les 2 avec le même résultat...

Reply

Marsh Posté le 05-05-2009 à 16:37:15    

ok merci j'esseil de suite

Reply

Marsh Posté le 05-05-2009 à 16:48:58    

Merci sa marche niquel mais mon seul petit problème c'est que j'aurai voulut voir la suite des origine (ceu qui ne sont pas touché par le regroupement) mais je crois que c'est impossible.
 
En tous cas un grand merci

Reply

Marsh Posté le 05-05-2009 à 16:50:14    

Ca veut dire quoi "la suite des origines" ? Tu voudrais afficher le libellé complet de l'origine ?

Reply

Marsh Posté le 05-05-2009 à 16:54:09    

oui je voudrai affiché le libellé complet d'origine pour ceux qui sont qu'une fois ex: 1st_zui, 1st_oiuou, ouiou, 2st_oiiu, 2st_dfgh
 
je veu regroupé 1st et 2st mai je veu gardé complet ouiou
 
si c'est pas possible je laisse tombé

Reply

Marsh Posté le 06-05-2009 à 08:18:38    

mais es-ce possible????

Reply

Marsh Posté le 06-05-2009 à 08:18:38   

Reply

Marsh Posté le 06-05-2009 à 11:38:03    

Salut,
 
Ca doit être possible, en faisant de cette manière par exemple, ça te donne quoi :  
 
SELECT LEFT( CU.customers_from, 3 ) AS Origin, COUNT( CU.customers_id ) AS Effectif_Vg
FROM EN_CUSTOMER CU
INNER JOIN EN_COMMANDES CO ON CU.customers_id = CO.customers_id  
WHERE ***CO ou CU ??? *** .customers_gratuite = '1'  
GROUP BY LEFT(CU.customers_from, 3)
HAVING COUNT( CU.customers_id ) > 1
UNION
SELECT CU1.customers_from AS Origin, COUNT( CU1.customers_id ) AS Effectif_Vg
FROM EN_CUSTOMER CU1
INNER JOIN JOIN EN_COMMANDES CO ON CU1.customers_id = CO.customers_id
WHERE ***CO ou CU ??? *** .customers_gratuite = '1'
GROUP BY LEFT( CU1.customers_from, 3 )
HAVING COUNT( CU1.customers_id ) = 1  
 
Par contre, c'est à tester, je n'ai pas regardé si tous les cas fonctionnaient... Dans la base que j'ai utilisée pour faire les tests, ça semble bien se passer...
 
Bon courage,


Message édité par Tibar le 06-05-2009 à 11:39:05
Reply

Marsh Posté le 06-05-2009 à 14:33:16    

ok merci c'est parfait

Reply

Sujets relatifs:

Leave a Replay

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