Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 15/02/2011, 12h56   #1
Invité de passage
 
Inscription : février 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 6
Points : 1
Points : 1
Par défaut Regroupement sur une partie d'un texte

Bonjour,

J'ai un petit souci concernant une requete SQL sur une base de données un peu complexe.

J'ai réalisé un extract de ma base avec la requete suivante :
Code :
1
2
3
4
 
SELECT COUNT( * ) , DAY( log_date ) , sigle_id
FROM  `log_sigle_id1102_fr` 
GROUP BY DAY( log_date ) , sigle_id
Voici un extrait du résultat:

Citation:
COUNT(*) ; day(log_date) ; sigle_id
1 ; 1 ; 0123sigleA456
2 ; 1 ; 8465sigleA82456
1 ; 1 ; 0123sigleA97384
6 ; 1 ; 0123sigleA97384
10 ; 1 ; 4287sigleB8358
1 ; 1 ; 4287sigleB8358
7 ; 1 ; 47sigleB073
10 ; 2 ; 0110sigleC9735
19 ; 2 ; 0110sigleC9735
26 ; 2 ; 0123sigleA456
34 ; 3 ; 4287sigleB8358
21 ; 3 ; 4287sigleB8358
100 ; 3 ; 0110sigleC9735
Je souhaiterai maintenant regrouper les count par groupe de sigle pour atteindre un resultat du type:

Citation:
COUNT(*); day(log_date); sigle_id
10 ; 1 ; %sigleA%
18 ; 1 ; %sigleB%
26 ; 2 ; %sigleA%
29 ; 2 ; %sigleC%
55 ; 3 ; %sigleB%
100 ; 3 ; %sigleC%
Je sais qu'il va falloir que j'imbrique plusieurs requetes et suggérer des LIKE et des SUM mais je n'arrive pas à trouver le déclic...!

Merci de votre aide !
pepsilone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 13h37   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Il te faudrait une table avec les, disons, catégories de sigle, càd sigleA, sigleB, etc. Par exemple :

Code :
1
2
CREATE TABLE categ_sigles (categ_id VARCHAR(10)) ;
INSERT INTO categ_sigles (categ_id) VALUES ('sigleA', 'sigleB', 'sigleC') ;
Ensuite, il faut effectivement faire une jointure LIKE et un GROUP BY sur la catégorie :

Code :
1
2
3
4
SELECT COUNT(*), DAY(L.log_date), C.categ_id
FROM  log_sigle_id1102_fr AS L
  INNER JOIN categ_sigles AS C ON C.categ_ID LIKE CONCAT('%', L.sigle_id, '%')
GROUP BY DAY(L.log_date ), C.categ_id
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 14h12   #3
Invité de passage
 
Inscription : février 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 6
Points : 1
Points : 1
Merci Antoun

Mais ce qui est compliqué c'est que je ne peux pas faire de table pour les sigles. Ils apparaissent en recupération de flux de liens d'où les numéros avant/apres les sigles.
Jusqu'à présent je pouvais faire une extraction avec un select count, etc. Where signe_id LIKE '%sigleA%'. Les dollars me permettent de faire abstraction de ce qui se trouve avant et après le sigle commun. Mais cette extraction doit ensuite être faite pour chaque sigle. Et il y en a beaucoup.

Je voudrais donc une même requete (idealement) qui me permet de regrouper les sigles par leur racine commune avec un LIKE '%sigleA%' et faire la somme des résultats comptés.
pepsilone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 14h18   #4
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
OK :

Code :
1
2
3
4
5
6
SELECT COUNT(*), 
  DAY(log_date), 
  substr(sigle_id FROM instr(sigle_id, 'sigle') FOR 6) AS categ
FROM  log_sigle_id1102_fr
GROUP BY DAY(log_date ), 
  substr(sigle_id FROM instr(sigle_id, 'sigle') FOR 6)
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 14h45   #5
Invité de passage
 
Inscription : février 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 6
Points : 1
Points : 1
je vais commencer à devenir embêtante, et je m'excuse, en réalité j'ai oublié de préciser un point.

J'ai plusieurs sigles. sigleA, sigle B, sigleC etc. Qui en réalité ne se ressemblent pas ni dans leur nom, ni dans leur longueur de caractères.

Ensuite ces sigles se retrouvent dérivés dans des chaines du type :

0211sigleA4525
1234sigleA86456x897346

9347sigleB8345x86345_blabla
9347sigleB8345x86345_blabla

La requête que tu me conseilles ne fonctionne donc pas si il s'agit de sigles qui ne s'appellent pas sigle et ont des longueurs de caractères différentes... si?
pepsilone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 15h02   #6
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Effectivement, je me repère à la présence du mot "sigle" et je suppose qu'il n'y a ensuite qu'un caractère à prendre en compte. Donc "sigleZ" sera reconnu, mais "sigleABCD" sera tronqué en "sigleA" et "acronymeK" ne sera pas reconnu du tout.

A toi de nous dire quels sont tes cas, et à quoi on peut reconnaître la catégorie.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 15h21   #7
Invité de passage
 
Inscription : février 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par Antoun Voir le message
Effectivement, je me repère à la présence du mot "sigle" et je suppose qu'il n'y a ensuite qu'un caractère à prendre en compte. Donc "sigleZ" sera reconnu, mais "sigleABCD" sera tronqué en "sigleA" et "acronymeK" ne sera pas reconnu du tout.

A toi de nous dire quels sont tes cas, et à quoi on peut reconnaître la catégorie.
C'est ce qu'il me semblait en effet, au temps pour moi ! Je vais essayer d'être plus claire :

J'ai une table qui contient les éléments suivants :
log_id (type int qui s'autoincremente)
sigle_id (type varchar)
log_date (type date)

j'ai une quarantaine de sigles_id fixes différents du type
sigleA
blabla
hpovu
...

Sauf que ces sigles sont parfois dérivés en
0111sigleA_8634
239467blabla29364
0211hpovu_ttf_56

Les requetes que j'utilise pour le moment sont :
Code :
1
2
3
4
SELECT count(*),day(log_date) 
FROM `log_sigle_id1102_fr` 
WHERE sigle_id LIKE '%blabla%' 
GROUP BY day(log_date)
cette requete me permet alors d'extraire toutes les données par jour pour le sigle "blabla". Mais m'oblige à recommencer pour chaque sigle_id

Ou alors :
Code :
1
2
3
SELECT COUNT( * ) , DAY( log_date ) , sigle_id
FROM  `log_sigle_id1102_fr` 
GROUP BY DAY( log_date ) , sigle_id
Ce qui me permet alors d'extraire par jour les données pour tous les sigles_id différenciés par ordre alphabétiques mais sans les regrouper par même racine et donc sans additionner les resultats pour une même racine.

Ce que je voudrais moi, c'est une requête qui me donnerait au final
jour | nombre d'entrées totales | sigle_id (ex: blabla)
pepsilone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 15h32   #8
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Si tu as une quarantaine de sigle_id fixes que tu connais à l'avance, il suffit que tu en fasses une table et on revient à ma première solution.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 15h52   #9
Invité de passage
 
Inscription : février 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par Antoun Voir le message
Si tu as une quarantaine de sigle_id fixes que tu connais à l'avance, il suffit que tu en fasses une table et on revient à ma première solution.
J'en ai une quarantiane de fixes oui, mais avec les dérivés j'en ai quelques milliers, et il y en a régulierement des nouveaux...

Je vais continuer à chercher, il doit bien y avoir une solution !
pepsilone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 15h59   #10
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 544
Points : 9 544
Avec ma première solution, tu ne mets que les fixes, et la jointure LIKE reconnaîtra automatiquement les dérivées.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/02/2011, 16h07   #11
Invité de passage
 
Inscription : février 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 6
Points : 1
Points : 1
Citation:
Envoyé par Antoun Voir le message
Avec ma première solution, tu ne mets que les fixes, et la jointure LIKE reconnaîtra automatiquement les dérivées.
Ok j'essaierai ça alors.
Merci de ton aide !
pepsilone 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 10h55.


 
 
 
 
Partenaires

Hébergement Web